2013-03-15 6 views
6

Я знаю, что Java не поддерживает множественное наследование, не позволяя расширять несколько классов. Я просто хочу знать, есть ли обходной путь для моей проблемы.Расширение нескольких классов

У меня есть класс с именем CustomAction, которому необходимо расширить два абстрактных класса, BaseAction и QuoteBaseAction. Я не могу изменить какой-либо из этих абстрактных классов и сделать одно другое.

Эти абстрактные классы имеют реализации методов, которые мне нужно использовать. Я не могу создать интерфейс, так как интерфейс может расширять только другой интерфейс.

Любые идеи?

+4

Возможно, образец композиции может помочь вам - http://en.wikipedia.org/wiki/Composite_pattern –

+0

ли эти классы реализуют любой интерфейс? Не могли бы вы показать нам эти классы? –

+0

Эти классы abstarct реализуют некоторые другие классы. Мне нужно использовать реализацию метода в этих абстрактных классах. – jijo

ответ

3

Здесь вы идете ...

public class CustomAction extends BaseAction { 
    class Inner extends QuoteBaseAction { 

    } 
} 
+2

Это не наследование: вы не можете заменить QuoteBaseAction на CustomAction. Это будет работать, если единственной целью является повторное использование существующего кода. Но в этом случае нет необходимости распространяться от BaseAction, его можно повторно использовать с помощью механизма компоновки. – Roman

+0

CustomAction необходимо расширить два абстрактных класса (требования), и это то, что делает вышеуказанный код. Вы создаете экземпляр класса Inner, и у вас есть все методы/функциональные возможности обоих классов. –

+1

Нет, это не так. И снова наследование абсолютно не связано с повторным использованием кода. Вы не можете передать экземпляр CustomAction методу, который принимает QuoteBaseAction. – Roman

-1

В java абстрактные классы позволяют расширять другие абстрактные классы.

5

Composition является способ go.Make один из ваших абстрактного класса как часть вашего класса.

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

Я не понял последнюю часть. «Abs2 abs2 = ...». Abs2 не может быть установлен с использованием нового оператора. Как я могу использовать метод, реализованный в Abs2 с использованием объекта abs2? – jijo

+0

@jijo вы можете использовать анонимный класс, который реализует эти методы в ABs2. как Abs2 abs2 = новый Abs2() {// реализует все эти абстрактные методы в абс2} – PermGenError

0

Ваш лучший выбор - делегация. Вы можете реализовать оба интерфейса (если эти классы используют интерфейс) или создавать интерфейсы для использования там, а затем удерживать экземпляр каждого класса внутри вашего класса, которому вы делегируете свои вызовы.

1

Нет, вы не можете наследовать два абстрактных класса. Вы можете обойти это, если абстрактные классы реализуют интерфейсы. В этом случае, вы можете заменить наследование композиции:

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(); 
    } 
} 
Смежные вопросы