Ich lese O'Reillys Buch "Programming Android", und ich versuche, den Abschnitt "Überschreibungen und Rückrufe" ab Seite 99 zu verstehen. Sie verwenden dies als Beispiel für guten Code:
%Vor% Und später nennen wir das ein Anti-Muster wegen des Fehlens der Erweiterbarkeit Kapselung:
Ich sehe den funktionalen Unterschied zwischen den beiden nicht, abgesehen davon, dass der zweite viel besser lesbar ist. Beide nehmen ein TextView und implementieren eine Handler-Funktion zum Überschreiben. Wäre die zweite nicht genauso leicht mit so etwas zu erweitern?
%Vor%ein Anti-Pattern aufgrund mangelnder Erweiterbarkeit
Erweiterbar sind sie insofern ähnlich, als bei beiden Ansätzen eine Unterklasse das vorhandene TextChangeListener
durch Überschreiben von handleTextChange
; aber sie unterscheiden sich darin, dass nur Ansatz Nr. 2 es auch für eine Unterklasse leicht macht, ein neues TextChangeListener
hinzuzufügen, ohne das existierende (geerbte) zu ändern.
Selbst wenn die Oberklasse den Ansatz # 1 verwendet, könnte die Unterklasse immer noch einen neuen TextChangeListener
hinzufügen, indem sie den Ansatz # 2 verwendet; aber wenn wir über das generelle Muster sprechen, dann wird eine konsistente Verwendung von Ansatz 2 mehr Erweiterbarkeit bieten als eine konsistente Verwendung von Ansatz # 1.
Ich würde das 2. Formular nicht mögen, da die Klasse eine Schnittstelle als Trick implementiert, nicht weil die Klasse natürlich ein Untertyp der Schnittstelle ist.
Die zweite Form kann für einfache Fälle überschaubar sein, also ist es in Ordnung, es sei denn, es wird zu unordentlich.
In Java 8 können wir die 1. Form in einer besseren Syntax verwenden:
%Vor%Tags und Links java android polymorphism