سؤال

كنت أتساءل كيف ترث الارتباطات والتبعيات ومثل هذه العلاقات في UML (أو دعنا نقول ، بشكل عام). لذلك ، في مثل هذا:

  ┌──────────┐                                        ┌──────────┐
  │  ClassA  │                                        │  ClassB  │
  ├──────────┤                                        ├──────────┤
  │          │─────────"One kind of relation"────────>│          │
  ├──────────┤                                        ├──────────┤
  │          │                                        │          │
  └──────────┘                                        └──────────┘
        ^
       /┬\
        │
        │
        │
        │
  ┌─────┴────┐
  │  ClassC  │
  ├──────────┤
  │          │
  ├──────────┤
  │          │
  └──────────┘

ملحوظة:

  • classa-classc في علاقة تعميم ، ويقصد السهم أن يكون صلبًا
  • Classa-ClassB في واحدة من [التبعية ، الارتباط ، التجميع ، التكوين
  • يونيكود رائع ، لكنه بدا أفضل بكثير مع خط المحرر :)

سؤالي هو ، كيف ترث هذه العلاقات؟ على سبيل المثال ، عندما تعتمد Classa على ClassB ، هل تعتمد ClassC على ClassB؟ إلخ.

شكرًا لك.

هل كانت مفيدة؟

المحلول

أنت لا تسأل سؤالًا UML ، فأنت تطرح سؤالاً أكثر عمومية.

ماذا يعني الميراث؟

ClassC هي فئة فرعية من Classa. في كل لغة برمجة تنفذ الميراث ، ستحتوي ClassC على جميع ميزات Classa.

بلغة لا تدعم الميراث ، يجب عليك إنشاء وهم الميراث المناسب من خلال التأكد من أن جميع ميزات Classa هي أيضًا جزء من ClassC.

هذا هو تعريف الميراث. دائما و ابدا. حتى في مخططات UML.

نصائح أخرى

الإجابة البسيطة هي نعم (ويجب ألا تحتاج إلى النظر إلى أبعد من ذلك للأغراض العملية).

لكن الأمر أكثر تعقيدًا مما يبدو ؛ نقلاً عن دليل مرجع لغة النمذجة الموحدة ، الطبعة الثانية:

الكلمات تعميم و ميراث غالبًا ما يتم استخدامها بالتبادل ، ولكن هناك بالفعل مفهومين مرتبطين ولكن متميزان. التعميم هو علاقة تصنيفية بين عناصر النمذجة. يصف ما عنصر هو. الميراث هو آلية للجمع بين الأوصاف الإضافية المشتركة لتشكيل وصف كامل لعنصر. في معظم الأنظمة الموجهة للكائنات ، يعتمد الميراث على التعميم ، ولكن يمكن أن يعتمد الميراث على مفاهيم أخرى ، مثل مؤشر تفويض اللغة الذاتية. يتيح بناء آلية الميراث على علاقة التعميم العوملة وتبادل الأوصاف والسلوك المتعدد الأشكال. هذا هو النهج الذي اتبعته معظم اللغات الموجهة للكائنات و UML. لكن ضع في اعتبارك أن هناك مناهج أخرى يمكن أن تؤخذ والتي تستخدمها بعض لغات البرمجة.

أتذكر محاضرة طويلة جدًا ، في عام 2003 ، حول الفرق بين التعميم والميراث. باختصار ، ينتمي هذان المفهومان إلى مستويات مختلفة من تصميم البرمجيات ، أو اقتبس من مارتن فاولر في الطبعة الثالثة ، الطبعة الثالثة ، "وجهات نظر مختلفة للنمذجة":

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

مفهوم التعميم ينتمي إلى مستوى التصميم المفاهيمي.

لكن الميراث هو مفهوم ينتمي إلى منظور التنفيذ:

من خلال منظور البرنامج ، فإن التفسير الواضح هو الميراث: عميل الشركات هو فئة فرعية من العميل. في لغات OO السائدة ، ترث الفئة الفرعية جميع ميزات الطبقة الفائقة وقد تتجاوز أي طرق فائقة.

أتذكر مثالاً حيث كان الفرق بين التعميم والميراث منطقيًا حقًا:

مربع هو مستطيل. يأتي ذلك من تعريفاتهم في الرياضيات:

  • المستطيل هو رباعي الأضلاع مع أربع زوايا يمين
  • المربع عبارة عن مضلع مع أربعة جوانب وزوايا متساوية

على مستوى التصميم ، هناك علاقة تعميم بين المربع والمستطيل.

ولكن على مستوى التنفيذ ، تتوسل الأمور إلى الاختلاف:

  • يمكن تعريف المستطيل بمقياسين: عرضه وارتفاعه
  • يمكن تعريف المربع بواسطة مقياس واحد ، لأن جميع الأطراف متساوية

سيكون من نتائج عكسية أن ترث عرض وارتفاع فئة المستطيل في الفئة المربعة ، مما يتطلب قيودًا إضافية لضمان توفير نفس القيمة إلى مجموعة للعرض ومستقر للارتفاع.

هذه حالة (منفعل إلى حد ما أعترف بها) حيث لن تترجم علاقة تعميم باستخدام الميراث على مستوى التنفيذ.

حسنًا ، كانت تلك الأيام.

نظرًا لأن الميراث عبارة عن علاقة "IS-A" (بدون تورية) ، يمكنك قراءتها على أنها "ClassC هي classa ، والتي تعرف classb" ، لذلك:

على سبيل المثال ، عندما تعتمد Classa على ClassB ، هل تعتمد ClassC على ClassB؟

-- نعم :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top