Warum ist der Diamant des Todes und nicht das Dreieck des Todes [duplizieren]

8

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 soll

vorausgesetzt, 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.

    
grumpynerd 15.05.2013, 05:45
quelle

2 Antworten

1

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() .

    
Grisha Weintraub 15.05.2013 06:04
quelle
0

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.

    
paxdiablo 15.05.2013 06:08
quelle