2013-04-16 3 views
6

У меня уже есть эта рабочая иерархия, и программа работает так, как ожидалось. В основном я отвлек все в базовом классе, а все остальные подклассы добавляют свои собственные методы.Применимый шаблон проектирования

abstract Class Base{ 
} 

class A extends Base{ 
    //new methods 
} 

class B extends Base{ 
    //new methods 
} 

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

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

Мне нужны оба метода и переменные в классе A и классе B, но я не знаю, как это сделать? Любые подсказки о том, как мне это сделать? Я не так хорош в дизайне, поэтому я подумал просить его здесь.

Благодаря

UPDATE Это на самом деле JSF Managed Bean, в котором я отведенной все в базе Managed Bean и всех других подклассов переопределением/добавления своих собственных реализаций на верхней части основания управляемый компонент. Существует только новое требование, которое было добавлено в котором я нуждался функциональность обоих подклассов (А и В) в новый подкласс (C)

+0

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

+6

Вам нужны методы, но есть ли отношение 'C является A и B' необходимым? Вы можете использовать композицию, но ваш пост нуждается в дополнительной информации, чтобы узнать, подходит ли это. –

+1

Yeh рассматривает состав и имеет 'C' содержат экземпляры' A' и 'B'. –

ответ

4

рефакторинга кода и сделать A и B и Base интерфейсов вместо классов и использование наследование интерфейса вместо наследования реализации.
Тогда можно реализовать как A и B (это, как множественное наследование поддерживается в Java)

+1

В вопросе @Mark Эстрада упомянул «Мне нужны оба метода и переменные в классе A и классе B». Поэтому я предполагаю, что он не может изменять интерфейсы 'A' и' B', поскольку они, похоже, имеют переменные-члены. – codeMan

+0

@codeMan: переменные-члены не являются проблемой. Ему просто нужно правильно переделать его код. – Cratylus

+1

И тогда ему придется переопределить все методы вместо использования существующего кода. –

3

либо использовать композицию или использовать внутренний класс.

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

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

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

Другое решение - создать экземпляр типа A или/и B в классе C (композиция).

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

Вы можете также использовать смешанный подход, используя как наследование и композицию, как расширить и создать экземпляр В.

1

Позволяет C содержать A и B, но и сделать его extend Base затем передать, чтобы вы не должны дублировать что угодно.

class C extends Base 
{ 
    A a = new A(); 
    B b = new B(); 

    // Now delegate any implemented methods from Base to A and B 

    @Override 
    public void anAbstractMethod() 
    { 
     a.anAbstractMethod(); 
     b.anAbstractMethod(); 
    } 
} 
Смежные вопросы