Es gibt eine Reihe von Problemen mit der Mehrfachvererbung, wenn sie mit vollwertigen Klassen verwendet wird, aber alle drehen sich um Mehrdeutigkeiten .
Die Mehrdeutigkeit zeigt sich auf verschiedene Arten:
- Wenn Sie zwei Basisklassen mit demselben Feld
x
haben und der abgeleitete Typ danach fragt x
, was bekommt er?
- Wenn die beiden
x
Variablen inkongruente Typen haben, können Sie daraus schließen.
- Wenn sie vom selben Typ sind, können Sie versuchen, sie in derselben Variablen zusammenzuführen.
- Sie können sie immer als seltsame, vollständig qualifizierte Namen ausgeben.
- Wenn Sie zwei Basisklassen mit der gleichen Funktion
f
und identischen Signaturen haben und jemand anruft f
, welche wird angerufen?
- Was ist, wenn die beiden Basisklassen einen gemeinsamen virtuellen Vorfahren haben (das Diamantenproblem)?
- Was ist, wenn die Funktion unterschiedliche, aber kompatible Signaturen hat?
- Wenn Sie eine Klasse mit zwei Basisklassen erstellen, wird welcher Konstruktor der Basisklasse zuerst aufgerufen? Wenn Sie das Objekt zerstören, welches wird getötet?
- Wie machen Sie es konsequent, wenn Sie das Objekt im Speicher anordnen?
- Wie gehen Sie mit all diesen Fällen mit 3 Basisklassen um? 10?
Dabei werden Dinge wie dynamischer Versand, Typinferenz, Musterabgleich und andere Dinge, von denen ich weniger weiß, ignoriert, die schwieriger werden, wenn die Sprache die mehrfache Vererbung vollständiger Klassen unterstützt.
Merkmale oder Mix-Ins (oder Schnittstellen oder ...) sind alle Konstrukte, die die Fähigkeiten eines Typs spezifisch einschränken , so dass es keine Mehrdeutigkeiten gibt. Sie besitzen selbst selten etwas. Dadurch wird die Komposition von Typen reibungsloser, da es keine zwei Variablen oder zwei Funktionen gibt ... es gibt eine Variable und eine Referenz; eine Funktion und eine Signatur. Der Compiler weiß, was zu tun ist.
Der andere übliche Ansatz besteht darin, den Benutzer zu zwingen, ihren Typ einzeln zu "bauen" (oder zu mischen). Anstatt dass die Basisklassen gleichberechtigte Partner im neuen Typ sind, fügen Sie einen Typ zum anderen hinzu und überschreiben dabei alle vorhandenen Typen (normalerweise mit optionaler Syntax, um die überschriebenen Bits umzubenennen und / oder wieder verfügbar zu machen).
Gibt es etwas, das mit Mixins / Merkmalen nicht möglich ist, aber mit Mehrfachvererbung im C ++ - Stil?
Je nach Sprache wird es im Allgemeinen schwierig oder unmöglich, Implementierungen von Funktionen und Speicher für Variablen aus mehreren Basisklassen zusammenzuführen und im abgeleiteten Typ verfügbar zu machen.
Kann man mit ihnen auf Diamantenprobleme stoßen?
Gelegentlich treten je nach Sprache weniger schwerwiegende Abweichungen auf, in der Regel jedoch keine. Der gesamte Sinn der Merkmale besteht darin, diese Art von Zweideutigkeit zu überwinden.