Gibt es einen Unterschied zwischen
public class A extends AbstractB implements C
{...}
gegen...
public class A extends AbstractB
{...}
abstract class AbstractB implements C
{...}
Ich verstehe, dass Klasse A in beiden Fällen der Schnittstelle entspricht. Im zweiten Fall AbstractB
kann die Implementierung für Schnittstellenmethoden in bereitgestellt werden C
. Ist das der einzige Unterschied?
Wenn ich will nicht in eine Implementierung für jede der Schnittstellenverfahren zur Verfügung zu stellen AbstractB
, welche Art sollte ich verwenden ? Hat die Verwendung des einen oder anderen Dokuments einen versteckten Zweck?
java
interfaces
abstract-class
c_maker
quelle
quelle
Antworten:
Es hängt alles davon ab, ob
AbstractB implements C
semantisch. Dh wenn es semantisch sinnvoll ist, esAbstractB
zu implementierenC
, dann machen Sie es.An konkreten Beispielen wird der semantische Unterschied deutlich.
Wenn A = Hund, AbstractB = Tier, C = IBark
Die einzig sinnvolle Wahl ist
Dies macht keinen Sinn, da dies bedeuten würde, dass alle Tiere bellen.
Die anderen Unterschiede kommen ins Spiel, wenn Sie mehr als nur
class A
erbenAbstractB
. In # 1 müssen sie C nicht implementieren, in # 2 sind sie alle gezwungen, C zu implementieren.quelle
Heterotroph
es außerdem sinnvoll, sieAnimal
implementieren zu lassenHeterotroph
. Wenn Sie viele andere bellende Tiere erwarten und sie auf die gleiche Weise behandeln möchten, ist eine andere KlasseBarkingAnimal extends Animal implements IBark
der richtige Weg.Heterotroph
aber danke für Ihre EingabeDer einfache Weg, die richtige Vererbungsbeziehung zu bestimmen, besteht nicht darin, die Klassen selbst zu betrachten, sondern den Code, der Methoden für diese Klassen aufruft . Irgendwo in Ihrem Code haben Sie etwas wie
AbstractB b = new A();
oderotherObject.addAbstractB(this);
. In beiden Fällen verwenden Sie dieseAbstractB
Referenz später, um verschiedene Methodenaufrufe durchzuführen.Wollen Sie in dieser Situation Methoden von aufrufen
C
? Wenn ja, dannAbstractB
sollte implementierenC
. Wenn nicht, sollte es nicht. Wenn Sie keine derartigen Situationen haben, benötigen Sie keine Vererbung und sollten die Komposition neu definieren, da sie viel lockerer gekoppelt ist.quelle
Es ist kein "versteckter" Dokumentationszweck. Sie können AbstractB und alle seine Unterklassen in C umwandeln. Es gibt tatsächlich drei Stile.
Ich würde dieses verwenden, wenn AbstractB C nicht logisch implementieren würde. Auch wenn es die Methoden nicht bereitstellt, könnte es eine Bedeutung haben. Wie Dog erweitert Animal Wag Utensilien. Es macht nicht für alle Tiere Sinn, Wag. Beachten Sie, dass dieser Ansatz AbstractB nicht davon abhält, die Implementierung bereitzustellen.
Ich würde diese verwenden, wenn alle Unterklassen die Schnittstelle implementieren sollen UND es für alle von ihnen sinnvoll ist, dies zu tun. Wie Beagle erweitert AbstractDog Wag.
Dieser ist überflüssig, kann aber zu mehr Klarheit führen.
quelle