Angenommen, wir haben die folgenden Spielzeugschnittstellen:
%Vor%und wir haben eine Klasse, die beide Schnittstellen implementiert:
%Vor% An dieser Stelle sehe ich verschiedene Möglichkeiten, Methoden auf Duck
aufzurufen, und ich kann mich nicht entscheiden, welches die beste Vorgehensweise ist.
Betrachten Sie dieses Szenario:
Dieses Programm wird sich wie erwartet verhalten, da das an die Funktion übergebene Objekt zufällig in Flyer
und Speakable
umgewandelt werden kann, aber ich schaue mich zusammen, wenn ich Code wie diesen sehe, weil er keine Überprüfung der Kompilierzeit erlaubt aufgrund der engen Kopplung kann es unerwartete Ausnahmen auslösen, wenn beispielsweise ein anders typisiertes Objekt (das nicht auf eine oder beide der Schnittstellen umsetzbar ist) als Parameter übergeben wird oder wenn die Implementierung von Duck
die Zeile nach unten ändert, sodass% nicht mehr implementiert wird co_de%.
Ich sehe Java-Code die ganze Zeit geschrieben, manchmal in Lehrbüchern (zum Beispiel S. 300 von "Head First Design Patterns" von O'Reilly), also muss es einen Verdienst geben, den ich vermisse.
Wenn ich ähnlichen Code schreiben würde, würde ich versuchen, Downcasting auf einen Typ oder eine Schnittstelle zu vermeiden, der nicht garantiert ist. Zum Beispiel würde ich in diesem Szenario so etwas tun:
%Vor%Was würde ich tun können:
%Vor%Ist das ein unnötiger Overkill? Was sind die Fallstricke dafür?
Ich glaube, dieses Design entkoppelt die Funktion Flyer
von seinen Parametern und hält böse Fehler aufgrund der Überprüfung der Kompilierzeit in Schach.
Warum wird die erste Methode in der Praxis so häufig verwendet und die letzte nicht?
Ich sehe Java-Code die ganze Zeit geschrieben, manchmal in Lehrbüchern (zum Beispiel S. 300 von "Head First Design Patterns" von O'Reilly), also muss es einen Verdienst geben, den ich vermisse.
Dieses Buch wurde ursprünglich 2004 veröffentlicht und ich glaube nicht, dass Java zu dieser Zeit Generics unterstützte. So war das unsichere Casting damals sehr üblich. Wahrscheinlich würde ich, wenn ich nicht die Unterstützung von parametrischem Polymorphismus in Java hätte, zuerst prüfen, ob der Parameter eine Instanz des Typs ist, in den ich ihn umsetzen möchte, und dann die eigentliche Umwandlung durchführen:
%Vor%Mit Generics können wir dies jedoch tun:
%Vor% Hier kann der Compiler sicherstellen, dass wir nicht etwas weiterleiten, das Speakable
und Flyer
nicht implementiert und solche frechen Versuche zur Kompilierzeit erkennen kann.
Warum wird die erste Methode in der Praxis so häufig verwendet und die letzte nicht?
Es könnte sein, dass Sie eine Menge Legacy-Code gesehen haben, nehme ich an. :)
Sie können das Argument gleichzeitig als Speakable
und Flyer
erzwingen, indem Sie eine generische Methode mit dem Typ intersection erstellen:
Sie brauchen also kein Casting oder erstellen eine zusätzliche Schnittstelle.
Tags und Links java inheritance oop casting downcasting