2012-04-04 8 views
12

Mam klasy jak:Jak zawinąć klasę w java i zapisać interfejs?

MyClass extends MyAbstractClass implement myInterface1, myInterface2,... 

muszę stworzyć nową klasę z dodatkowych pól:

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

Wydaje się, że prawidłowe utworzyć nową klasę, która będzie zawijany MojaKlasa jak:

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

Ale MyWrapClass używany jako typ myInterface1 lub myInterface2!

Pytanie brzmi: czy powinienem zadeklarować wszystkie metody potrzebne dla interfejsów myInterface1, myInterface2 w MyWrapClass? Lub istnieje inny sposób? Dzięki.

+0

Jeśli chcesz utworzyć klasę z nowym polem, musisz rozszerzyć oryginalną klasę. Ktoś powiedział mi, że lepiej jest utworzyć zmienną interfejsu niż klasy, a to dlatego, że możesz dodawać metody do interfejsu bez zmieniania kodu całej klasy i każdej klasy, która używa instancji tej klasy. . Mimo to udało mi się uzyskać dobrą odpowiedź, ale może pomóc w rozszerzeniu klas i dodaniu nowych metod, do których chciałbyś się przyłączyć. –

Odpowiedz

16

Zasadniczo istnieją dwa sposoby. Pierwszy z nich jest rozszerzenie klasy bazowej:

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

Drugą opcją jest użycie składzie:

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(); 
     } 
     ... 
} 

Druga opcja jest zalecana przez wiele Java Guru:

Josha Blocha książki Effective Java 2. wydanie

  • Artykuł 16: Kompozycja nad odziedziczeniem
  • Pozycja 17: Projektowanie i dokument do dziedziczenia albo zabronić mu

Dobry projektowania obiektowego nie jest o liberalnie rozbudowę istniejących klas. Twoim pierwszym instynktem powinno być zamiast tego komponowanie.

Zobacz także http://en.wikipedia.org/wiki/Composition_over_inheritance

Skład nad dziedziczenia może uprościć wstępnego projektu klas domenowych firm i zapewnić bardziej stabilną domenę działalności w perspektywie długoterminowej. Jego przewagą nad dziedziczeniem jest dokładniejsza izolacja interesów niż może być opisana przez hierarchię klas potomnych. Ponadto modele dziedziczenia są często stosowane podczas definiowania klas domen biznesowych w celu uzyskania sensu informacji w domenie problemu i niekoniecznie odzwierciedlają prawdziwy związek różnych obiektów systemowych.

P.S .: kod automatycznego generowania na składzie jest wspierany przez niektóre z nowoczesnych IDE

3

Nie zawijać, tylko podklasy:

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

Zakładając, że nie może rozciągać się MojaKlasa, to nie istnieje żaden inny sposób można mieć MyWrapClass i używać go jak MojaKlasa. Na przykład przyda mi się implementacja mapy w celu zawinięcia rzeczywistej mapy. Ma wiele funkcji i każdy z nich musi zostać zaimplementowany, z którego zamierzasz korzystać. Tutaj jest trochę luzu, jeśli nie planujesz przekazać go do funkcji, której nie pisałeś, możesz dodać wszystkie wymagane metody i wdrożyć tylko te, których potrzebujesz. Jednak często tak nie jest.

Alternatywnie można napisać klasę dummy, która implementuje wszystkie metody interfejsów wywołujących opakowanie. Następnie możesz zastąpić tę klasę własną implementacją, umożliwiając zawracanie klasy opakowania bez konieczności implementowania wszystkich metod za każdym razem.

2

Załóżmy, że nie może przedłużyć MojaKlasa i chcesz mieć możliwość korzystania z MyWrapClass jako typ myInterface1 lub myInterface2. Można wykonać następujące czynności:

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

    methodInInterface1() { 
     myClass.methodInInterface1() 
    } 

    .... 

jesteś delegatem wszystkim wdrożenie metody w myInterface1 i myInterface2 do MojaKlasa. Wierzę, że to się nazywa Kompozycja.

+0

@Eugen Retunsky pokonałeś mnie do tego. Twoje zdrowie, – hongbo

Powiązane problemy