2013-03-15 26 views
6

Wiem, że Java nie obsługuje dziedziczenia wielokrotnego, nie zezwalając na rozszerzenie więcej niż jednej klasy. Chcę tylko wiedzieć, czy istnieje obejście mojego problemu.Rozszerzanie wielu klas

Mam klasę o nazwie CustomAction, która musi obejmować dwie abstrakcyjne klasy: BaseAction i QuoteBaseAction. Nie mogę zmienić żadnej z tych klas abstrakcyjnych i zrobić jednego rozszerzenia innych.

Te abstrakcyjne klasy mają implementacje metod, z których muszę skorzystać. Nie mogę utworzyć interfejsu, ponieważ interfejs może rozszerzyć tylko inny interfejs.

Wszelkie pomysły?

+4

Prawdopodobnie wzór Skład może pomóc - http://en.wikipedia.org/wiki/Composite_pattern –

+0

Czy te klasy implementuje żadnego interfejsu? Czy możesz pokazać nam te zajęcia? –

+0

Te klasy abstarct implementują inne klasy. Muszę skorzystać z implementacji metody w tych abstrakcyjnych klasach. – jijo

Odpowiedz

3

Proszę bardzo ...

public class CustomAction extends BaseAction { 
    class Inner extends QuoteBaseAction { 

    } 
} 
+2

To nie jest dziedziczenie: nie można zastąpić QuoteBaseAction przez CustomAction. Będzie działać tylko wtedy, gdy jedynym celem będzie ponowne wykorzystanie istniejącego kodu. Ale w tym przypadku nie ma potrzeby rozszerzania programu BaseAction, można go ponownie użyć za pomocą mechanizmu składu. – Roman

+0

CustomAction musi rozszerzyć dwie klasy abstrakcyjne (wymaganie) i to właśnie robi powyższy kod. Tworzysz instancję klasy Inner i masz wszystkie metody/funkcjonalności obu klas. –

+1

Nie, nie ma. Po raz kolejny dziedziczenie absolutnie nie dotyczy ponownego użycia kodu. Nie można przekazać instancji CustomAction do metody akceptującej QuoteBaseAction. – Roman

-1

W języku java możliwe jest, że klasy abstrakcyjne rozszerzają inne klasy abstrakcyjne.

5

Composition jest sposobem go.Make jedną z twojej klasy abstrakcyjnej jako część swojej klasie.

public abstract class Abs1 { 
// 
} 
public abstract class Abs2 { 
// 
} 
public class Main extends Abs1 { 
Abs2 abs2 = ... 
//impl 
} 
+0

Nie rozumiem ostatniej części. "Abs2 abs2 = ...". Abs2 nie można zainicjować za pomocą nowego operatora. Jak mogę skorzystać z metody zaimplementowanej w Abs2 używając obiektu abs2? – jijo

+0

@jijo możesz użyć anonimowej klasy, która implementuje te metody w ABs2. podobnie jak Abs2 abs2 = new Abs2() {// implementuje wszystkie te abstrakcyjne metody w abs2} – PermGenError

0

Twoim najlepszym wyborem będzie delegacja. Możesz zaimplementować oba interfejsy (jeśli te klasy używają interfejsu) lub utworzyć interfejsy do użycia, a następnie wstrzymać instancję każdej klasy wewnątrz klasy, do której delegujesz swoje połączenia.

1

Nie, nie można dziedziczyć z dwóch klas abstrakcyjnych. Możesz obejść to, jeśli klasy abstrakcyjne implementują interfejsy. W tym przypadku można zastąpić dziedziczenie z składzie:

abstract class BaseAction implements Action { ... } 

abstract class QuoteBaseAction implements QuoteAction { ... } 

class CustomAction implements Action, QuoteAction { 

    private BaseAction baseAction; 
    private QuoteBaseAction quoteBaseAction; 

    public Bar methodFromAction() { 
     return baseAction.methodFromAction(); 
    } 

    public Foo methodFromQuoteAction() { 
     return quoteBaseAction.methodFromQuoteAction(); 
    } 
}