2013-05-20 15 views
11

Ich habe einen Abschnitt meines Codes, wo einige Klassen eine Schnittstelle implementieren.Abstrakte Klasse und Schnittstelle zusammen?

Es fühlt sich richtig an, aber es gibt ein wenig Duplizierung unter den Kindklassen - nämlich 3 Methoden.

Also schreit dies, um eine abstrakte Klasse zu verwenden.

Meine Frage ist, wird es Nachteile werden sowohl abstrakte Klasse mit und Schnittstelle in den folgenden Situationen:

  1. Abstrakte Klasse die Schnittstelle und untergeordneten Klassen zu implementieren, um die abstrakte Klasse
  2. Kinderklassen zu erweitern die abstrakte Klasse zu erweitern und die Schnittstelle

Oder

Should abstrakte Klassen und Schnittstellen implementieren nicht so zusammen benutzt werden?

+1

Kein Grund, warum sie nicht sein sollten –

+2

Nop, überhaupt nicht. In der Tat ist das meiste, was ich mache, genau so. –

Antwort

16

Es ist vollkommen normal, diese beiden zusammen zu verwenden. Betrachten Sie zum Beispiel AbstractList (Implementieren List) und AbstractMap (Implementieren Map) im JDK.

Meine Kurzschlussreaktion wäre zu haben gewesen hat die abstrakte Klasse die Schnittstelle implementieren und dann leiten die konkreten Klassen daraus:

abstract class Base implements TheInterface { 
    /* ...shared methods... */ 
} 

class Concrete1 extends Base { } 

class Concrete1 extends Base { } 

Aber Ihre Frage die andere Möglichkeit erhöht, machte mich denken, und ich kann nicht viel eines Arguments sehen vor, dass das so tun:

abstract class Base { 
    /* ...shared methods... */ 
} 

class Concrete1 extends Base implements TheInterface { } 

class Concrete1 extends Base implements TheInterface { } 

des weiteren kann ich ein Argument für es auf diese Weise tun, und zwar sehen, dass es die Kopplung zwischen dem abstrakten c entfernt Mädchen und die Schnittstelle. Wenn Sie eine andere Klasse haben, die die Funktionalität Base bietet, aber nicht benötigt, um die Schnittstelle zu implementieren, haben Sie die Flexibilität, das zu tun.

Es gibt auch eine dritte Option: Zusammensetzung. Sie können nicht eine abstrakte Klasse haben überhaupt, sondern die zahlreichen konkreten Klassen haben, die die Schnittstelle Verwendung eine gemeinsame Hilfsklasse bei der Umsetzung implementieren:

class Helper { 
    /* ...shared methods... */ 
} 

class Concrete1 implements TheInterface { 
    /* ...uses instance of Helper */ 
} 

class Concrete1 implements TheInterface { 
    /* ...uses instance of Helper */ 
} 

Dies hat die gleiche Flexibilität, in einer anderen Form.

1

Ich glaube nicht, dass es eine Faustregel als solche gibt. Versuchen Sie beim Entwerfen und befolgen Sie die SOLID-Prinzipien, um herauszufinden, ob das, was Sie tun, gut oder schlecht ist. Sie können diese Prinzipien über here finden. In diesem speziellen Fall sollten Sie meines Erachtens sicherstellen, dass Sie sich an das "Open-Close-Prinzip" halten.

0

Persönlich bevorzuge ich die Aussage, dass eine abstrakte Klasse ein Hintergrund für andere Klassen ist, also wenn drei andere Klassen etwas gemeinsam haben, sollte ihr gemeinsamer Vorfahr, die abstrakte Klasse, die nur für diese drei anderen Klassen erstellt wurde, auch Code von der Schnittstelle. Dies würde die abstrakte Klasse (auf ihre Art) "vollständig" machen und all diese Eigenschaften und Methoden bereitstellen, die die drei Klassen teilen.

Es macht jedoch schließlich keinen Unterschied, ob alle die gleiche Schnittstelle implementieren würden. Abstrakt zu sein und alles zu geben, was gewöhnlich ist, ist meiner Meinung nach ein klarer Weg. Es ist dann einfacher, Klassen zu vergleichen, indem man nur auf das schaut, was sich unterscheidet.

Verwandte Themen