الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مسألة في Oop ما رأيك ؟

بدأه Khaled.Alshaya في 28 يوليو 2009 · 18 رد · 3,179 مشاهدة · في هندسة البرمجيات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ...

بداية, أعتقد أن الجميع درس أو يعرف ما هي OOP.... طريقة تصميم لا أكثر....

لدينا مسألة ننتاقش فيها, لمن يحب بالطبع, فكر في السؤال, و أعطنا رأيك,

هذا السؤال لايوجد له جواب واحد, كل شخص يمكن أن يضع طريقة تصميم و نقارن بين الطرق...

تصور أننا نريد بناء برنامج, هذا البرنامج يحتوي على صنفين classes... مربع square و مكعب cube. هناك علاقة هذين الكائنين بلاشك...

ماهي العلاقة برأيك, حاول أن تضع تصميمك في ضوء البرمجة الكائنية,

سأضع مالدي بعد أن أرى آرائكم, و لكن أعيد بأنه لا توجد طريقة واحدة لحل هذا النوع من المسائل,

هذا السؤال لازلت أذكره منذ زمن بعيد, حيث وضع "الأستاذ" الإجابة النموذجية و رفض غيرها, و للأسف كانت الإجابة التي وضعها من أسوأ الإجابات التي رأيتها!

اقترح أن المكعب يرث من المربع!

ما رأيك في هذه الإجابة, و إذا كان لديك تصور آخر فشاركنا به :)

تحياتي ...

#2

يعتمد على البرنامج و الهدف من الكلاس اصلا,

في بعض الاحيان قد لا توجد بينهما اي علاقة,

و بعبارة اخرى, we need more details

#3

أتفق هنا مع حسن. يعتمد على الهدف من التصميم. و لو أنني لا استطيع أن أفكر في سيناريو يرث المربع من المكعب.

#4

السلام عليكــم ورحمـة الله وبركاتــه ،،

هذه محاولة اتمنى تقييمك

  1.  
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. class sqaure
  6. {
  7. protected:
  8. int x;
  9. public:
  10. sqaure(int i)
  11. {x=i;}
  12. int getArea(){return x*x;}
  13. };
  14.  
  15. class cube : public sqaure
  16. {
  17. public:
  18. cube(int i):sqaure(i)
  19. {x=i;}
  20. int getArea(){return x*sqaure::getArea();}
  21. };
  22.  
  23. int main()
  24. {
  25. sqaure S1(5);
  26. cube C1(10);
  27.  
  28. cout<<"S1 Area = "<<S1.getArea()<<endl;
  29. cout<<"C1 Area = "<<C1.getArea()<<endl;
  30.  
  31. return 0;
  32. }
  33.  

amdvsintel22.jpg

--i use AMD--

لا اله الا الله محمد رسول الله

أستعن بالله و لا تعجز

تابعنى على تويتر

***

#5

السلام عليكــم ورحمـة الله وبركاتــه ،،

اقتباس
اقترح أن المكعب يرث من المربع!

لماذا يرث المكعب من المربع

المكعب ليس مربعاً

المكعب يحتوى على عدة مربعات

إذاً فالعلاقة بين كائن المكعب و كائن المربع هى Association و ليست Inheritance

المشروع يحتوى على 3 ملفات

IGeometry و هو يحتوى على الخصائص المشتركة التى يمكن تطبيقها على الفئات الموجودة بالمشروع مع اختلاف ال Implementation

CSquare و هو ملف الفئة الخاصة بكائن المربع

CCube و هو ملف الفئة الخاصة بكائن المكعب

  1.  

  2. Public Interface IGeometry
  3.  
  4. Property EdgeLength() As Double
  5. ReadOnly Property SurfaceArea() As Double
  6. ReadOnly Property SurfacePrimeter() As Double
  7.  
  8. End Interface
  9.  
  10.  
  11.  

  1.  
  2. Public Class CSquare
  3. Implements IGeometry
  4.  
  5. #Region " Members "
  6. Dim _EdgeLength, _Perimeter, _SurfaceArea As Double
  7. Const _NoOfEdges As Integer = 4
  8. #End Region
  9.  
  10. #Region " Properties "
  11.  
  12. Public ReadOnly Property NoOfEdges() As Integer
  13. Get
  14. Return _NoOfEdges
  15. End Get
  16. End Property
  17.  
  18. Public Property EdgeLength() As Double Implements IGeometry.EdgeLength
  19. Get
  20. Return _EdgeLength
  21. End Get
  22. Set(ByVal value As Double)
  23. _EdgeLength = value
  24. End Set
  25. End Property
  26. Public ReadOnly Property SurfaceArea() As Double Implements IGeometry.SurfaceArea
  27. Get
  28. Return GetSurfaceArea()
  29. End Get
  30.  
  31. End Property
  32. Public ReadOnly Property Primeter() As Double Implements IGeometry.SurfacePrimeter
  33.  
  34. Get
  35. Return GetPrimeter()
  36. End Get
  37.  
  38. End Property
  39.  
  40. #End Region
  41.  
  42. #Region " Functions "
  43.  
  44. Function GetSurfaceArea() As Double
  45. Return (Me.EdgeLength) * (Me.EdgeLength)
  46. End Function
  47. Function GetPrimeter() As Double
  48. Return (Me.NoOfEdges * Me.EdgeLength)
  49. End Function
  50.  
  51. #End Region
  52.  
  53.  
  54. End Class
  55.  
  56.  
  57.  
  58.  

  1.  
  2. Imports System.Collections.Generic
  3. Public Class CCube '6 Square Faces
  4. Implements IGeometry
  5.  
  6. #Region " Members "
  7.  
  8. Const _NoOfFaces As Integer = 6
  9. Dim _EdgeLength As Double
  10. Dim _Square As New CSquare
  11.  
  12. #End Region
  13.  
  14. #Region " Properties "
  15.  
  16. ReadOnly Property CubeSides() As List(Of CSquare)
  17.  
  18. Get
  19.  
  20. Dim ListOfSquares As New List(Of CSquare)
  21. ListOfSquares.Capacity = CCube._NoOfFaces
  22. For Each SQ As CSquare In ListOfSquares
  23. SQ.EdgeLength = Me.EdgeLength
  24. Next
  25.  
  26. Return ListOfSquares
  27.  
  28. End Get
  29. End Property
  30.  
  31. Public Property EdgeLength() As Double Implements IGeometry.EdgeLength
  32. Get
  33. Return _EdgeLength
  34. End Get
  35. Set(ByVal value As Double)
  36. _EdgeLength = value
  37. End Set
  38. End Property
  39. Public ReadOnly Property SurfaceArea() As Double Implements IGeometry.SurfaceArea
  40. Get
  41. Return GetCubeArea()
  42. End Get
  43. End Property
  44. Public ReadOnly Property SurfacePrimeter() As Double Implements IGeometry.SurfacePrimeter
  45. Get
  46. Return GetCubePrimeter()
  47. End Get
  48. End Property
  49. Public ReadOnly Property Volume() As Double
  50. Get
  51. Return GetVolume()
  52. End Get
  53. End Property
  54.  
  55. #End Region
  56.  
  57. #Region " Functions "
  58.  
  59. Private Function GetCubeArea() As Double
  60. _Square.EdgeLength = Me.EdgeLength
  61. Return CCube._NoOfFaces * _Square.SurfaceArea
  62. End Function
  63.  
  64. Private Function GetCubePrimeter() As Double
  65. _Square.EdgeLength = Me.EdgeLength
  66. Return CCube._NoOfFaces * _Square.Primeter
  67. End Function
  68. Private Function GetVolume()
  69. Return (Me.EdgeLength) * 3
  70. End Function
  71.  
  72. #End Region
  73. End Class
  74.  
  75.  
  76.  

ملفات المشروع مرفقة بالموضوع

post-5617-1248775311_thumb.jpg

Cube_Square_Relation.rar

تم تعديل هذه المشاركة بواسطة طارق إبراهيم في 28 يوليو 2009 في 17:20

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#6

العلاقة بينهما انهما الاثنين shape هل يمكن استخدام فئة اخرى ؟

ويمكن ان نقول :

cube has a square

بدلا من

cube is a square

 

[color= #0000ff;]class Cube

[color= #000000;]{

	Square[color= #000000;]* square;

	[color= #0000ff;]int x;

 

	[color= #0000ff;]public[color= #000000;]:

		Cube[color= #000000;]([color= #0000ff;]int i[color= #000000;]);

		~Cube[color= #000000;]([color= #000000;]);

 

		[color= #0000ff;]int area[color= #000000;]([color= #000000;]);

[color= #000000;]};

 

Cube[color= #000000;]::[color= #808000;]Cube[color= #000000;]([color= #0000ff;]int i[color= #000000;])

[color= #000000;]{

	x [color= #000000;]= i;

	square [color= #000000;]= [color= #0000ff;]new Square[color= #000000;](i[color= #000000;]);

[color= #000000;]}

 

Cube[color= #000000;]::~Cube[color= #000000;]([color= #000000;])

[color= #000000;]{

	[color= #0000ff;]delete square;

[color= #000000;]}

 

[color= #0000ff;]int Cube[color= #000000;]::[color= #808000;]area[color= #000000;]([color= #000000;])

[color= #000000;]{

	[color= #0000ff;]return x[color= #000000;]*square[color= #000000;]-[color= #000000;]>area[color= #000000;]([color= #000000;]);

[color= #000000;]}

وشكرا.

تم تعديل هذه المشاركة بواسطة SudaNix في 28 يوليو 2009 في 13:32

#7

أعتقد أن الأحوط مادمنا لا نملك معلومات أكثر أن يكون كل منهم في class خاصة به, دون أي علاقة بينهم, فلا داعي لوجود علاقة قوية مثل الInheritance دون أي داعي, فلا يعتبر الCube امتداد للمربع (ربما هندسياً المربع هو مكعب و لكن بارتفاع صفر) و لكن هذا أيضاً غير مجدي و لا يوفر أي كود أو يقدم أي جديد.

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#8

لو عممنا الموضوع بعض الشيئ

بإمكاننا أن نقول أن المربع له طول و عرض، أما المكعب له طول و عرض و إرتفاع

إذا ببساطه

post-133895-1248803475_thumb.jpg

مجرد محاولة !!

#9
SudaNix كتب:
العلاقة بينهما انهما الاثنين shape هل يمكن استخدام فئة اخرى ؟

ويمكن ان نقول :

cube has a square

بدلا من

cube is a square

  1. class Cube { Square* square; int x; public: Cube(int i); ~Cube(); int area(); }; Cube::
    Cube(int i) { x = i; square = new Square(i); } Cube::~Cube() { delete square; } int Cube::a
    rea() { return x*square->area(); }
  2.  

وشكرا.

و لكن مساحة المكعب ليست الطول * العرض * الارتفاع. في هذه الحالة الدالة area تحسب الحجم .

مساحة المكعب هي مجموع مساحات الأسطح و هي 6* مساحة المربع

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#10

السلام عليكم ...

أخي حسن و system down :)

اقتباس
يعتمد على البرنامج و الهدف من الكلاس اصلا,

في بعض الاحيان قد لا توجد بينهما اي علاقة,

و بعبارة اخرى, we need more details

اقتباس
أتفق هنا مع حسن. يعتمد على الهدف من التصميم. و لو أنني لا استطيع أن أفكر في سيناريو يرث المربع من المكعب.

أنا لم أطلب تصميماً متكاملاً, أنا طلبت تصورك عن التصميم بشكل عام,

ماهي العلاقة بين الإثنان, أم أنه لا توجد علاقة أصلاً... الفائدة من OOP حسبما أفهم أنك تقوم بإعادة استعمال الأصناف حيثما ذهبت, و بالتالي لو قمنا بتغيير الأصناف كل مرة نريد استخدامها لا OOP فائدة أصلاً.

أخي eramax,

implementation مثالي لتصميم سيء جداً :P

أنا لم أطلب أصلاً كتابة الأصناف, كل ما أردت معرفته هو رأيك في نقطة هل توجد وراثة أصلاً, و إذا كان كذلك فمن يرث من ؟

هذه التصميم الذي وضعه الأستاذ أصلاً, و اختلفت معه تماماً :)

أخي طارق,

اقتباس
لماذا يرث المكعب من المربع

المكعب ليس مربعاً

المكعب يحتوى على عدة مربعات

إذاً فالعلاقة بين كائن المكعب و كائن المربع هى Association و ليست Inheritance

جميل أنت أول من يعطيني رأيه في الموضوع :)

أنت تقول بأنه لا توجد علاقة وراثة بين الصنفين, و أن المكعب يحتوي على 6 مربعات لا أكثر,

و كلاهما يرثان الواجهة IGeometry...

أخي motamayez,

اقتباس
أعتقد أن الأحوط مادمنا لا نملك معلومات أكثر أن يكون كل منهم في class خاصة به, دون أي علاقة بينهم, فلا داعي لوجود علاقة قوية مثل الInheritance دون أي داعي, فلا يعتبر الCube امتداد للمربع (ربما هندسياً المربع هو مكعب و لكن بارتفاع صفر) و لكن هذا أيضاً غير مجدي و لا يوفر أي كود أو يقدم أي جديد.

أيضاً جميل, النقطة التي أثرتها سأعلق عليها لاحقاً بإذن الله حول كون المربع مكعباً بارتفاع صفر,

أخي خلدون,

اقتباس
بإمكاننا أن نقول أن المربع له طول و عرض، أما المكعب له طول و عرض و إرتفاع

المشكلة أني لا أتفق معك في هذا :)

هناك تصميمان اقتنعت بهما سأضعهما بإذن الله في القريب العاجل,

هذه مسألة بسيطة و ربما ليست واقعية, أردت فقط معرفة بعض الآراء حول هذه المسألة :)

تحياتي ,,,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 29 يوليو 2009 في 01:36

#11

أعتقد أن صنف واحد يفي بالغرض,,

فالـ cube هو عبارة عن 6 مربعات

والمربع square هو عبارة عن 1 مربع....!

فهذا الصنف فيه متغير يحتوى على عدد المربعات, ومتغير آخر لطول الضلع,,

double shape::get_area()
{
		return (len*len) * squares_count;
}

}

بانتظار ما لديك أخ خالد,,

تحياتي

SAFETY TIP : Always delete what you new, and free what you malloc, never mix new with free or malloc with delete.

#12
اقتباس
مساحة المكعب هي مجموع مساحات الأسطح و هي 6* مساحة المربع

شكرا على التصحيح ، لم انتبه الى المعادلة :lol:

#13

السلام عليكم ...

هناك حلان اقتنعت بهما,

الأول,

المربع يرث من المضلع polygon. و المكعب يرث من الـ polyhedron. لا أدري ما ترجمة polyhedron في العربية, و لكن معناها الشكل المتعدد الأسطح.

لماذا اقنتعت بهذا الحل ؟

لأن دالة مثل area أو perimeter تعطي معنى محدد في polygon و ينطبق هذا المعنى على المربع, كما ينطبق على أي مضلع.

نفس الكلام ينطبق على المتعدد الأسطح, فالحجم ينطبق على المكعب كما ينطبق على أي متعدد أسطح.

أعتقد أن البعض بنى تصميمه على الـ member variables, و هذا برأيي خاطئ, لأنه لا علاقة للتصميم الداخلي للكائن بكونه يرث من كائن آخر أم لا يرث منه,

و هذا نقطة الإعتراض مع الأستاذ الذي وضع السؤال في الأصل. لا أدري إن كان هذا منطقياً لديك :)

لماذا أعتقد أن فكرة وراثة المكعب من المربع أو العكس خاطئة ؟

تصور قطعة الكود التالية للتوضيح دون الدخول في التفاصيل.

void fun(Cube* cube)
{
	int area = cube->area();
}

كما ترى لو أن المكعب هو الـ base class فإنه عند إرسال المربع لهذه الدالة, و استدعاء دالة المساحة!

مفهوم المساحة للمربع نفسه مختلف عن مفهوم المساحة للمكعب.

بينما لأي مضلع, فالمساحة بين جميع الأشكال الوارثة معرفة بشكل سليم, المساحة المحاطة بالأضلاع :)

نفس الكلام ينطبق على المكعب و أنه يرث من الـ polyhedron. مساحة أي متعدد أسطح معرفة لجميع الأشكال متعددة الأسطح, كما أن الحجم معرف بشكل سليم لجميع متعددات الأسطح الوراثة, سواء كان الوارث مكعباً أو هرم أو غيره :)

الحل الثاني,

هو النقطة التي أشار إليها الأخ متميز :)

و هي أن المربع ما هو إلا مكعب ارتفاعه صفر. و هي نقطة جميلة حقيقية. و لكن اختلف معه في شيء سأوضحه في السطور التالية.

الحل الثاني يقترح بأن المكعب و المربع ليسا أصنافاً classes أصلاً :) و إنما كائنات من صنف نعرفه اسمه hypercube.

الـ hypercube عبارة عن مفهوم و ليس شكلاً حقيقياً, يمكنك القراءة عن هذا المفهوم في wikipedia. و لكن ببساطة الـ hypercube عبارة عن صنف عندما يتم بناؤه يتم تمرير الأبعاد إليه, فإذا كان عدد الأبعاد الممررة = 2 فالشكل مربع,

إن كان عدد الأبعاد الممرة = 3 فالشكل مكعب, و هكذا.

لم أقتنع بهذا الحل كثيراً, و لكنه طريقة تفكير مختلفة, تلغي فكرة كون المربع و المكعب أصنافاً, أصلاً :)

عموماً, الطريقة التي أتبعها في تصميم الأصناف, هي أن الصنف الأب يجب أن يحدد مفهوماً محدداً, بحيث يكون الصنف الأب هو التعميم و الأصناف الوارثة هي التخصيص,

و مساحة المكعب و المربع مفهومين مختلفين, لهذا عارضت فكرة وراثة أحدهما من الآخر في الأساس.

ليس هناك "جواب" لهذه المسألة بشكل قطعي, فهي تعتمد على المصمم بالطبع, و لكن هذا ما رأيته صحيحاً :)

تحياتي ...

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 29 يوليو 2009 في 03:55

#14

يا اخ خالد, و ايضا لجميع الاخوة اللذين اقترحوا حلول معقدة!! الـ inheritance ليست هدفا في حد ذاتها, اذا وجدت ان هناك كود مشترك بين اكثر من كلاس او فنكشن بامكانك عندها ان تستخدم اسلوب يقلل تكرار الكود, و احد هذه الاساليب هو الوراثة, و لكنها ليست هدفا لحد ذاتها.

و اتفق مع الاخ متميز انه من الافضل ان يكون كل منهما في كلاس منفصل لوحده, على الاقل مبدئيا

اخ خالد, لماذا اصلا تقترح انشاء كلاس polygon؟ لمجرد ان ترث منه square؟؟ هل هناك حاجة لهذا الـ polygon اصلا؟

اخ طارق ابراهم حلك بصراحة مخيف (اقصد انه يبدو طويلا و معقدا), هل هذه سي شارب؟

مبدئيا هذا حل بايثوني, طبعا بما انني لا اعرف الهدف من الكلاس اصلا فلا يوجد اي شيء سوى المساحة و الحجم ،،،

class Square(object):
	def __init__(self, x):
		self.x = x
	def area(self):
		return self.x * self.x

class Cube(object):
	def __init__(self, x):
		self.x = x
	def area(self):
		return 6 * self.x * self.x
	def volume(self):
		return self.x * self.x * self.x

تم تعديل هذه المشاركة بواسطة hasan_aljudy في 29 يوليو 2009 في 06:40

#15
اقتباس
اخ طارق ابراهم حلك بصراحة مخيف (اقصد انه يبدو طويلا و معقدا), هل هذه سي شارب؟

ليه يا حسن ده انا باحبك

حلى ليس معقداً و انما انا قمت بوضع الخصائص Properties و ال Members و الدوال Functions بالتفصيل هذا كل ما فى الامر

الحل يعتمد على واجهة Interface تحوى الطرائق و الخصائص المشتركة بين المكعب و المربع (بالامكان استخدامها لاحقاً فى حال اردنا اضافة اشكال اخرى و بالامكان استخدامها عند تمرير معاملات Parameters تستخدم هذه ال Interface)

هناك فئتين اخرتين هما CCube و CSquare و الاثنتين يحتويان على ال Interface Implementation

بامكانك مشاهدة ال Class Diagram للتبسيط

اللغة المستخدمة هى VB.NET (لان حالياً استخدمها فى مشروع و كانت المتاحة امامى فى وضع الحل)

اخى خالد

اقتباس
و كلاهما يرثان الواجهة IGeometry...

ليست وراثة و انما Interface Implementation

تم تعديل هذه المشاركة بواسطة طارق إبراهيم في 29 يوليو 2009 في 15:45

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#16
اقتباس
يا اخ خالد, و ايضا لجميع الاخوة اللذين اقترحوا حلول معقدة!! الـ inheritance ليست هدفا في حد ذاتها, اذا وجدت ان هناك كود مشترك بين اكثر من كلاس او فنكشن بامكانك عندها ان تستخدم اسلوب يقلل تكرار الكود, و احد هذه الاساليب هو الوراثة, و لكنها ليست هدفا لحد ذاتها.

أرى وجهة نظرك.

ببساطة هذا أحد الأسئلة الغبية في الجامعات, و الذي لن ترى له وجود في الحقيقة. الهدف كان من السؤال هو بناء أصناف بحيث نسمح بعمل extensibility :)

ببساطة ماهو موقع هذين الصنفين من هرم كائني.

أعلم أنه سؤال غبي :)

هناك شيء اختلف معك حوله, و لكنه خارج الموضوع. الوراثة ليست للـ code reuse.

إلا إن كنت تقصد الوراثة private أو protected في ++C :P

تحياتي ..

#17

هناك سؤال أكثر صعوبة و 90% من المبرمجين يخطئون فيه

هل المربع يرث من المستطيل ؟؟ هل المربع هو مستطيل متساوي الطول و العرض ؟

الوراثة هنا تخدع لأنه لو تخيلت أنك تستخدم مؤشر من نوع Rectangle على كائن من نوع Square و هو شئ طبيعي في الوراثة, ثم قمت بتغيير قيمة الطول أو العرض في الكائن, و لكن لأن الكائن ليس مستطيلاً فسيحاول دائماً الحفاظ على أن الطول و العرض متساويين و هنا ستسبب مشكلة لأنك لو تخيلت أن مستخدم المؤشر لم يكن يعرف (أو بالأصح لا يهتم) بنوع الكائن الذي يشير له, فهنا تم كسر الabstraction أو على الأخص تم كسر قاعدة Liskov لأنك تقوم بتغيير كلاً من الطول و العرض في حالة المربع و لكن في حالة المستطيل لا يحدث هذا.

لمزيد من التفاصيل عن Liskov Substitution Principal أو اختصاراً LSP

http://www.objectmentor.com/resources/articles/lsp.pdf

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#18

أستاذنا أيضاً اقترح أن المكعب يرث من المربع، في البداية لم أقتنع بهذا لأن المكعب ليس مربعاً كما قلتم. و لكن الأستاذ اقترح أن المكعب هو مربع ذو ارتفاع، و بالتالي يمكن استخدام بعض طرائق المربع لحساب خصائص المكعب، كما أن هذه الطريقة تبسط تصميم فئة المكعب. و بالتالي هذا حل منطقي و ممكن.

من الممكن أيضاً أن نجعل العلاقة علاقة ترابط، بأن نقول أن المربع هو وجه للمكعب، يمكنك وضع const في فئة المكعب يمثل عدد الأوجه و هو 6، هذا سيسهل فهم بض الحسابات لأنها تصيح مجرد نقل للصيغة الرياضية. هذا هو الكود المقترح (بالجافا)

public class Cube{

private static final int faceNo=6
private Square face

public Cube(int dim){
   face new Square(dim);
}

public int getArea(){
   return face.getArea()*faceNo;
}

public int getVolume(){
   return face.getArea*face.getDim();
}
}

 

لا اشعر أنني ذكرت شيئاً جديدا لكن كلا التصميمين معقول، و لا أدري لماذا لا تعجبك فكرة وراثة المكعب من المربع ()هل كان أستاذك يكرهك:)). قد تكون على حق إذا أردنا أن نعمم، كأن نجعل الفئة الأساس Shape التي يرث منها 2DShape و 3DShape ، هنا لن تستطيع أن تربط بيض المربع و المكعب إلا عن طريق الـAssociation.

#19

مساء الخير في تقديري اولا اتفق انه على حسب المطلوب تحديدا ولكن

انا ممكن افكر بطريقة ثانيه اسوي كلاس الاب اللي ممكن الاثني ياخذو منه عوامل مشتركة مثلا لو افترضت الضلع او الشكل ،،،حسب ما توصلت له من متغيرات متشابهة

تحياتي

مواضيع مشابهة