Ich habe viele Beispiele gesehen, die die Gefahr der Mehrfachvererbung illustrieren.
Das Beispiel ist normalerweise wie Klasse B und C erweitert Klasse A, Klasse D erweitert B und C.
B und C überschreiben beide eine Methode von A, sagen wir zum Beispiel, gleich ();
dann, wenn Ruf D.equals (); es weiß nicht, welches von seinem Elternteil
genannt werden sollvorausgesetzt, dass equals () in D nicht überschrieben wird.
Was kann ich sehen, ist Klasse A in diesem Beispiel nicht redundant? Wenn wir A aus dieser Hierarchie entfernen und nur B und C betrachten, wenn B und C beide eine Methode namens equals () haben, dann, wenn D B und C erweitert, wird es immer noch das gleiche Problem haben, also ist es nicht wirklich a Dreieck des Todes?
Ich bin nicht sicher, ob das, was ich annahm, Kompilierungszeitfehler in einer anderen Sprache verursacht.
Hoffe jemand kann es für mich klären.
Wenn D extends B and C
nicht die Methode equals()
überschreibt, die in B und C implementiert ist, gibt es keine Mehrdeutigkeit - D kann B.equals()
oder C.equals()
verwenden.
Mit der Diamantstruktur andererseits, wenn D A.equals()
aufruft und B und C diese überschreiben, wissen Sie nicht, welche Methode aufgerufen werden soll B.equals()
oder C.equals()
.
Sie haben tatsächlich Recht, es ist nicht notwendig, dass A
überhaupt existiert, um die Probleme der Mehrfachvererbung zu zeigen.
Der folgende Code (das "V des Todes", wie Craig es eloquent in einen Kommentar schreibt) ist genug:
%Vor%Wenn Sie versuchen, dies zu kompilieren, erhalten Sie:
%Vor%Beachten Sie jedoch, dass Sie sich explizit aussuchen können, was Sie möchten, etwa mit:
%Vor%Es gibt weitere Informationen zum Diamantproblem hier , einschließlich warum es ein anderes Problem ist.
Tags und Links inheritance design-patterns design multiple-inheritance