C ++ hat eine einfache Mehrfachvererbung, viele Sprachentwürfe verbieten es als gefährlich. Einige Sprachen wie Ruby und PHP verwenden jedoch eine seltsame Syntax, um das Gleiche zu tun und nennen es Mixins oder Merkmale. Ich habe oft gehört, dass Mixins / Merkmale schwerer zu missbrauchen sind als Mehrfachvererbung.
Was macht sie konkret weniger gefährlich? Gibt es etwas, das mit Mixins / Merkmalen nicht möglich ist, aber mit Mehrfachvererbung im C ++ - Stil? Kann man mit ihnen auf das Diamantenproblem stoßen?
Dies scheint, als ob wir Mehrfachvererbung verwenden, aber nur Ausreden dafür machen, dass dies Mixins / Merkmale sind, damit wir sie verwenden können.
Antworten:
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:
x
haben und der abgeleitete Typ danach fragtx
, was bekommt er?x
Variablen inkongruente Typen haben, können Sie daraus schließen.f
und identischen Signaturen haben und jemand anruftf
, welche wird angerufen?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).
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.
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.
quelle
with
Schlüsselwort dort funktioniert.