2012-04-04 6 views
12

Ich habe Klasse wie:Wie klasse ich die Klasse in Java und speichere die Schnittstelle?

MyClass extends MyAbstractClass implement myInterface1, myInterface2,... 

ich neue Klasse mit zusätzlichen Feldern erstellen müssen:

MyType1 field1; 
MyType2 field2; 
....... 

Es scheint, dass korrekte neue Klasse erstellen, die MyClass wie wickeln wird:

MyWrapClass { 
MyClass myClass=new MyClass(...); 
MyType1 field1; 
MyType2 field2; 
..... 

Aber MyWrapClass wird als Typ myInterface1 oder myInterface2 verwendet!

Also Frage ist: soll ich alle Methoden, die für die Schnittstellen myInterface1, myInterface2 in MyWrapClass benötigt werden, deklarieren? Oder existiert ein anderer Weg? Danke.

+0

Wenn Sie eine Klasse mit einem neuen Feld erstellen müssen, müssen Sie die ursprüngliche Klasse erweitern. Jemand hat mir gesagt, dass es besser ist, eine Variable einer Schnittstelle als die einer Klasse zu erstellen, und zwar weil man Methoden zu einer Schnittstelle hinzufügen kann, ohne den Code der ganzen Klasse und jeder Klasse, die eine Instanz dieser Klasse verwendet, zu ändern . Dies konnte ich bisher noch gut beantworten, aber es könnte helfen, Klassen zu erweitern und neue Methoden hinzuzufügen, für die Sie etwas tun möchten. –

Antwort

16

Grundsätzlich gibt es zwei Möglichkeiten. Erstens ist die Basisklasse zu erweitern:

public class MySubClass extends MyClass { 
    private MyType1 field1; 
    private MyType2 field2; 
.... 

Die zweite Option ist Zusammensetzung zu verwenden:

public class MySubClass implements myInterface1, myInterface2 { 
     private MyClass delegate; 
     private MyType1 field1; 
     private MyType2 field2; 

     // for all methods in myInterface1, myInterface2 
     public SomeType method1() { 
     return delegate.method1(); 
     } 
     ... 
} 

Die zweite Option wird von vielen Java-Gurus empfohlen:

Josh Blochs Buch Effective Java 2. Ausgabe

  • Element 16: Bevorzugung der Zusammensetzung über die Vererbung
  • Punkt 17: Entwurf und Dokument für die Vererbung oder anderes Design bestehende Klassen verbieten

gutes objektorientierte liberal nicht über erstreckt. Ihre erste Instinkt sollte stattdessen sein, zu komponieren.

Siehe http://en.wikipedia.org/wiki/Composition_over_inheritance

Zusammensetzung über Vererbung auch die ursprüngliche Gestaltung der Business Domain Klassen vereinfachen und einen stabilere Business-Bereich auf langer Sicht bieten. Ihr Vorteil gegenüber der Vererbung ist eine gründlichere Interessenselektion, als sie durch eine Hierarchie von Nachkommenklassen beschrieben werden kann. Darüber hinaus werden Vererbungsmodelle häufig bei der Definition von Geschäftsdomänenklassen erfunden, um die Informationen in der Problemdomäne sinnvoll zu machen, und spiegeln nicht unbedingt die wahre Beziehung verschiedener Systemobjekte wider.

P. S .: Auto-Erzeugungs Code für Komposition von einigen modernen IDEs unterstützt wird

3

Wickeln, nicht nur Unterklasse:

class MySubClass extends MyClass { 
    MyType1 field1; 
    MyType2 field2; 
    ... 
2

Angenommen, Sie MyClass nicht verlängern kann, dann ist kein es keinen anderen Weg Sie MyWrapClass haben können und es wie MyClass verwenden. Zum Beispiel ist es mir passiert, dass ich Map implementieren musste, um eine aktuelle Map zu umbrechen. Es hat viele Funktionen und jeder von ihnen muss implementiert werden, die Sie verwenden möchten. Es gibt hier ein wenig Spielraum, wenn Sie nicht vorhaben, es an eine a-Funktion zu übergeben, die Sie nicht geschrieben haben, können Sie alle erforderlichen Methoden hinzufügen und nur die implementieren, die Sie benötigen. Dies ist jedoch meistens nicht der Fall.

Alternativ könnten Sie eine Dummy-Klasse schreiben, die alle Methoden der Schnittstellen implementiert, die den Wrapper aufrufen. Dann können Sie diese Klasse mit Ihrer eigenen Implementierung überschreiben, sodass Sie eine Wrapper-Klasse wiederverwenden können, ohne jedes Mal alle Methoden implementieren zu müssen.

2

Angenommen, Sie nicht MyClass erweitern können, und Sie wollen in der Lage sein MyWrapClass als Typ myInterface1 oder myInterface2 zu verwenden. Sie können wie folgt vorgehen:

MyWrapClass implement myInterface1, myInterface2,...{ 
    MyClass myClass=new MyClass(...); 
    MyType1 field1; 
    MyType2 field2; 

    methodInInterface1() { 
     myClass.methodInInterface1() 
    } 

    .... 

Sie delegieren alle Methoden Implementierung in myInterface1 und myInterface2 zu MyClass. Ich glaube, das heißt Zusammensetzung.

+0

@Eugen Retunsky du schlägst mich dazu. Prost, – hongbo

Verwandte Themen