وراثة متعددة

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

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

 مشكلة الألماس 
تصغير| رسم تخطيطي للميراث لصنف الألماس. |بديل=|مركز|450x450بك
«مشكلة الماس» (يشار إليها أحيانًا باسم «الألماس المميت للموت» "Deadly Diamond of Death" ) هي غموض ينشأ عندما يرث صنفان 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 تربط الاثنين معًا في الأسفل لتشكيل شكل ألماسي.

 انظر أيضًا 

 مخطط موجه

 المراجع 

 ستروتروب، بيارني (1999). الوراثة المتعددة لـ C ++ . وقائع مؤتمر ربيع عام 1987 لمجموعة مستخدمي يونكس
 بناء البرمجيات الكينونية ، الطبعة الثانية، بقلم برتراند ماير، برنتيس هول، 1997، 



 روابط خارجية 

 تعليمي حول استخدام الميراث في إيفل
 دروس حول الاستخدام الفعال للميراث المتعدد في بيثون
 نظرة عامة على الميراث في Ocaml

تصنيف:صنف (حوسبة)