وراثة متعددة

من ويكيبيديا، الموسوعة الحرة
اذهب إلى التنقل اذهب إلى البحث

وراثة متعددة (بالإنجليزية: Multiple inheritance)‏ هو سمة من سمات بعض لغات البرمجة كائنية التوجه التي هي عبارة عن وراثة الكائن أو الصنف لخصائص وسمات من كائن أو أكثر من الكائنات الأصل أو الأصناف الأصل. وهي تختلف عن الوراثة الفردية، حيث قد يرث كائن أو صنف فقط من كائن أو صنف معين.

لقد كان الميراث المتعدد مسألة حساسة لسنوات عديدة، [1] [2] حيث أشار المعارضون إلى زيادة تعقيدها وغموضها في حالات مثل «مشكلة الألماس» diamond problem، حيث قد تكون غامضة حول من أي صنف من الأصناف الأصل تورث الميزة معينة ما إذا كان هناك أكثر من صنف من الأصناف الأصل تنفذ الميزة المذكورة. يمكن معالجة ذلك بطرق مختلفة، بما في ذلك استخدام الوراثة الافتراضية.[3] كما تم اقتراح طرق بديلة لتكوين الكائن لا تعتمد على الميراث مثل الخلطات والسمات لمعالجة الغموض.

مشكلة الألماس[عدل]

رسم تخطيطي للميراث لصنف الألماس.

«مشكلة الماس» (يشار إليها أحيانًا باسم «الألماس المميت للموت» "Deadly Diamond of Death" [4]) هي غموض ينشأ عندما يرث صنفان B و C من A ، ويرث الصنف D من كل من B و C.إذا وُجدت الطريقة في A والتي تقوم في B و C بتجاوزها، وD لا يتجاوزها، ونتج عن ذلك السؤال التالي أي نسخة من الطريقة تلك يجب أن يرثها الصنف D: أن من B، أو أن من C؟

على سبيل المثال، في سياق تطوير برامج واجهة المستخدم الرسومية، قد يرث Button الصنف من كلا الفئتين Rectangle (للمظهر) Clickable (للوظائف / معالجة الإدخال)، Rectangle Clickable من صنف Object . الآن إذا تم استدعاء طريقة equals لكائن Button وليس هناك مثل هذه الطريقة في صنف Button ولكن هناك طريقة equals متجاوزة في Rectangle أو Clickable (أو كليهما)، ما هي الطريقة التي يجب استدعاؤها في النهاية؟

يطلق عليها «مشكلة الألماس» بسبب شكل مخطط وراثة الأصناف في هذه الحالة. لذلك، يكون الصنف A في الأعلى، كل من B و C بشكل منفصل تحتها، و D تربط الاثنين معًا في الأسفل لتشكيل شكل ألماسي.

انظر أيضًا[عدل]

المراجع[عدل]

  1. ^ Cargill, T. A. (Winter 1991)، "Controversy: The Case Against Multiple Inheritance in C++"، Computing Systems، 4 (1): 69–82.
  2. ^ Waldo, Jim (Spring 1991)، "Controversy: The Case For Multiple Inheritance in C++"، Computing Systems، 4 (2): 157–171.
  3. ^ Schärli, Nathanael؛ Ducasse, Stéphane؛ Nierstrasz, Oscar؛ Black, Andrew، "Traits: Composable Units of Behavior" (PDF)، Web.cecs.pdx.edu، مؤرشف من الأصل (PDF) في 9 أغسطس 2017، اطلع عليه بتاريخ 21 أكتوبر 2016.
  4. ^ Martin, Robert C. (09 مارس 1997)، "Java and C++: A critical comparison" (PDF)، Objectmentor.com، مؤرشف من الأصل (PDF) في 24 أكتوبر 2005، اطلع عليه بتاريخ 21 أكتوبر 2016.

روابط خارجية[عدل]