我已经有了这个工作层次结构,程序按预期运行。基本上我已经在Base类中抽象了所有内容,并且所有其他子类都添加了自己的方法。
abstract Class Base{
}
class A extends Base{
//new methods
}
class B extends Base{
//new methods
}
一切看起来都很好,直到以后(错误...新的要求)我意识到我需要一个新的类(让我们称之为C类) A类和B类。现在,在java中它不可能扩展两个具体的类。
class C extends A, B{
//new methods
}
我需要A类和B类中的方法和变量,但我不知道该怎么做? 有关如何进行此更改的任何提示? 我在设计模式上不是那么好,所以我想在这里问一下。
由于
更新 这实际上是一个JSF Managed Bean,其中我在Base Managed Bean中抽象了所有内容,并且所有其他子类在基础托管bean之上覆盖/添加它们自己的实现。 只添加了一个新的要求,其中我需要将子类(A和B)的功能都放入一个新的子类(C)
答案 0 :(得分:4)
重构代码并使A
和B
和Base
接口而不是类,并使用接口继承而不是实现继承。
然后,您可以实现A
和B
(这是Java
支持多重继承的方式)
答案 1 :(得分:3)
使用合成或使用内部类。
class C extends A {
B b = ... // this is one option
class D extends B {
// this is another option
}
}
答案 2 :(得分:2)
理想情况下,您应该创建所有类A,B和Base作为接口,但正如您所提到的,上面的设计已经实现,我假设现在不是一个选项。
另一个解决方案是在C类(组合)中创建A或/和B类型的实例。
Class C{
A a=new A();
B b=new B();
}
您还可以使用继承和组合(如扩展A)和创建B实例的混合方法。
答案 3 :(得分: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();
}
}