تكرار السؤال: …
الإجابة المختصرة
تحدث المعضلة عندما ترث فئة من فئتين تشتركان في فئة أب مشتركة، مما يسبب غموضاً حول أي نسخة من دوال أو خصائص الأب يجب أن ترثها الفئة الابنة.
الشرح
إذا كانت الكلاس A تمتلك دالة foo()، وقامت كل من B و C بوراثة A وتعديل foo()، ثم ورثت الفئة D من B و C معاً، فعند استدعاء D.foo() لا يستطيع المترجم تحديد أي دالة يقصدها المبرمج. منعت لغات مثل Java و C# الوراثة المتعددة للفئات واكتفت بتعدد واجهات (Interfaces)، بينما حلتها C++ بالوراثة الافتراضية (Virtual Inheritance) واستخدمت Python خوارزمية C3 Linearization (MRO).
مثال بالكود
class A:
def foo(self):
return "A.foo"
class B(A):
def foo(self):
return "B.foo -> " + super().foo()
class C(A):
def foo(self):
return "C.foo -> " + super().foo()
class D(B, C):
pass
print(D().foo()) # B.foo -> C.foo -> A.foo
print([c.__name__ for c in D.__mro__]) # ['D', 'B', 'C', 'A', 'object']
# Python resolves the ambiguity with C3 linearization (MRO): A appears once, after both B and C.أخطاء شائعة
- الاعتقاد بأن تطبيق كلاس لعدة Interfaces يسبب مشكلة الألماس، في حين أن الواجهات بلا كود تنفيذي أصلي لا تحدث أي تصادم في الحالة.