وراثة متعددة
وراثة متعددة (بالإنجليزية: 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 تربط الاثنين معًا في الأسفل لتشكيل شكل ألماسي.
انظر أيضًا
المراجع
- Cargill, T. A. (Winter 1991)، "Controversy: The Case Against Multiple Inheritance in C++"، Computing Systems، 4 (1): 69–82.
- Waldo, Jim (Spring 1991)، "Controversy: The Case For Multiple Inheritance in C++"، Computing Systems، 4 (2): 157–171.
- 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.
- Martin, Robert C. (09 مارس 1997)، "Java and C++: A critical comparison" (PDF)، Objectmentor.com، مؤرشف من الأصل (PDF) في 24 أكتوبر 2005، اطلع عليه بتاريخ 21 أكتوبر 2016.
- ستروتروب، بيارني (1999). الوراثة المتعددة لـ C ++ . وقائع مؤتمر ربيع عام 1987 لمجموعة مستخدمي يونكس
- بناء البرمجيات الكينونية ، الطبعة الثانية، بقلم برتراند ماير، برنتيس هول، 1997، (ردمك 0-13-629155-4)
- Eddy Truyen؛ Wouter Joosen؛ Bo Nørregaard؛ Pierre Verbaeten (2004)، "A Generalization and Solution to the Common Ancestor Dilemma Problem in Delegation-Based Object Systems" (PDF)، Proceedings of the 2004 Dynamic Aspects Workshop (103–119)، مؤرشف من الأصل (PDF) في 31 مارس 2010.
- Ira R. Forman؛ Scott Danforth (1999)، Putting Metaclasses to Work، ISBN 0-201-43305-2. Ira R. Forman؛ Scott Danforth (1999)، Putting Metaclasses to Work، ISBN 0-201-43305-2. Ira R. Forman؛ Scott Danforth (1999)، Putting Metaclasses to Work، ISBN 0-201-43305-2.
روابط خارجية
- تعليمي حول استخدام الميراث في إيفل
- دروس حول الاستخدام الفعال للميراث المتعدد في بيثون
- نظرة عامة على الميراث في Ocaml
- بوابة برمجة الحاسوب