2013-04-16 135 views
6

我已经有了这个工作层次,程序按预期运行。基本上我已经抽象出一个Base类和所有其他子类中的所有东西,并添加它们自己的方法。适用的设计模式

abstract Class Base{ 
} 

class A extends Base{ 
    //new methods 
} 

class B extends Base{ 
    //new methods 
} 

一切看起来都很好,直到后来(errr ......新的要求)我知道我需要有一个新的类(允许调用这个类C)延伸两 类A和B.现在,在Java其无法扩展两个具体类。

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

我需要在A类和B类的方法和变量,但我不知道如何做到这一点? 有关如何进行此更改的任何提示? 我不擅长设计模式,所以我想在这里问它。

感谢

UPDATE 这实际上是Managed Bean的,其中我在抽象托管Bean一个底座等所有子类压倒一切的一切JSF /加入自己的实现,取决于基础之上托管bean。 有只是加入其中,我需要两个子类(A和B)的功能集成到一个新的子类(C)

+0

如果没有关于类的更多细节,这很难说,但听起来像使用基于组件的设计会更好。 –

+6

你需要的方法,但是关系'C是一个A和B'必要?你可以使用作文,但是你的文章需要更多的信息来判断这是否合适。 –

+1

叶考虑作文,并有'C'包含'A'和'B'的实例。 –

回答

4

重构代码,并作出新的要求ABBase接口,而不是类和使用接口继承而不是实现继承。
然后你就可以同时实现AB(这是继承了如何在多个被Java支持)

+1

问题@Mark Estrada提到“我需要类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和基地接口,但正如你所提到的,上面的设计已经实现我猜想,这是不是一种选择了。

另一种解决方案是在类C(组合)中创建类型A或/和B的实例。

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

您也可以同时使用继承和组合像延长A和B的创建实例

1

C包含AB也使它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(); 
    } 
}