6

我已经有了这个工作层次结构,程序按预期运行。基本上我已经抽象了基类中的所有内容,所有其他子类都添加了自己的方法。

abstract Class Base{
}

class A extends Base{
    //new methods
}

class B extends Base{
    //new methods
}

一切看起来都很好,直到后来(错误...新要求)我意识到我需要一个扩展 A 类和 B 类的新类(让我们称之为 C 类)。现在,在 java 中它不可能扩展两个具体类。

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

我需要 A 类和 B 类中的方法和变量,但我不知道该怎么做?关于如何进行此更改的任何提示?我的设计模式不是很好,所以我想在这里问它。

谢谢

更新 这实际上是一个 JSF 托管 Bean,其中我抽象了基础托管 Bean 中的所有内容,并且所有其他子类在基础托管 bean 之上覆盖/添加了它们自己的实现。只是添加了一个新要求,其中我需要将两个子类(A 和 B)的功能添加到一个新的子类(C)中

4

4 回答 4

4

重构您的代码并制作A和接口BBase不是类,并使用接口继承而不是实现继承。
然后您可以同时实现Aand B(这就是在 中支持多重继承的方式Java

于 2013-04-16T10:34:39.783 回答
3

要么使用组合,要么使用内部类。

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

   class D extends B {
     // this is another option 
   }  
}
于 2013-04-16T10:37:42.233 回答
2

理想情况下,您应该将所有类 A、B 和 Base 创建为接口,但正如您所提到的,上述设计已经实现,我假设现在这不是一个选项。

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

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

您还可以使用继承和组合的混合方法,例如扩展 A 并创建 B 的实例。

于 2013-04-16T10:39:27.400 回答
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();
   }
}
于 2013-04-16T10:46:58.180 回答