2013-04-16 23 views
6

Mam już działającą hierarchię i program działa zgodnie z oczekiwaniami. Zasadniczo wyodrębniłem wszystko w klasie bazowej i wszystkich innych podklasach dodając własne metody.Obowiązujący wzór Wzór

abstract Class Base{ 
} 

class A extends Base{ 
    //new methods 
} 

class B extends Base{ 
    //new methods 
} 

wszystko wygląda dobrze, dopóki później (eeee ... nowe wymagania) Zdaję sobie sprawę, muszę mieć nową klasę (nazwijmy to klasa C), który rozciąga się zarówno klasy A i B. Teraz w jego java nie można rozszerzyć dwóch klas betonowych.

class C extends A, B{ 
    //new methods 
} 

Potrzebuję obu metod i zmiennych w klasie A i klasie B, ale nie wiem jak to zrobić? Jakieś wskazówki dotyczące tego, jak to zmienić? Nie jestem tak dobry w projektowaniu, więc pomyślałem o zadaniu go tutaj.

Dzięki

UPDATE to faktycznie JSF Managed Bean którym ja wydobywane wszystko w bazie Managed Bean i wszelkie inne podklasy overriding/dodając własne implementacje na górnej części podstawy udało Bean. Jest tylko nowy wymóg, który został dodany w którym potrzebowałem funkcjonalność obu podklas (A i B) do nowej podklasy (C)

+0

Trudno powiedzieć bez większej ilości szczegółów na temat zajęć, ale wygląda na to, że lepiej poradzić sobie z projektem opartym na komponentach. –

+6

Potrzebujesz metod, ale czy związek "C jest A i B" jest konieczny? Możesz użyć kompozycji, ale Twój post potrzebuje więcej informacji, aby wiedzieć, czy jest to odpowiednie. –

+1

Yeh rozważyć skład i mieć 'C' zawierają wystąpienia' A' i 'B'. –

Odpowiedz

4

byłaby kodu i uczynić A i B i Base interfejsy zamiast klas i użytkowania dziedziczenie interfejsu zamiast dziedziczenia implementacji.
Następnie można realizować zarówno A i B (jest to jak wielokrotne dziedziczenie jest obsługiwany w Java)

+1

W pytaniu @ Mark Estrada wspomniałem "Potrzebuję obu metod i zmiennych w klasie A i klasie B" Tak więc, myślę, że nie może zmienić "A" i "B" na interfejsy, ponieważ wydają się mieć zmienne składowe. – codeMan

+0

@codeMan: zmienne członkowskie nie stanowią problemu. Po prostu musi przeprojektować swój kod poprawnie. – Cratylus

+1

I będzie musiał ponownie wdrożyć wszystkie metody zamiast używać istniejącego kodu. –

3

użyć składu lub używać wewnętrzną klasę.

class C extends A { 
    B b = ... // this is one option 

    class D extends B { 
    // this is another option 
    } 
} 
2

Idealnie należy utworzyć wszystkie klasy A, B i zasady jak interfejsy, ale jak już wspomniano powyżej, że projekt został już wdrożony jestem przy założeniu, że nie jest to opcja teraz.

Drugim rozwiązaniem jest utworzenie instancji typu A lub/i B w klasie C (skład).

Class C{ 
A a=new A(); 
B b=new B(); 
} 

Można również użyć podejście mieszane z wykorzystaniem zarówno dziedziczenie i skład jak rozszerzyć i utworzyć wystąpienie B.

1

Pozwala C zawierać A i B ale także sprawiają, że extend Base następnie przekazać, więc nie muszą duplikować wszystko.