6

この作業階層は既にあり、プログラムは期待どおりに実行されます。基本的に、基本クラスのすべてと、独自のメソッドを追加する他のすべてのサブクラスを抽象化しました。

abstract Class Base{
}

class A extends Base{
    //new methods
}

class B extends Base{
    //new methods
}

後ですべてがうまくいくように見えます(エラー...新しい要件)クラスAとBの両方を拡張する新しいクラス(これをクラスCと呼びましょう)が必要であることに気付きました。現在、Javaでは2つの具象クラスを拡張することはできません。

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

クラス A とクラス B のメソッドと変数の両方が必要ですが、これを行う方法がわかりません。この変更を行う方法に関するヒントはありますか? 私はデザインパターンが得意ではないので、ここで質問しようと思いました。

ありがとう

UPDATE これは実際にはJSFマネージドBeanであり、ベースマネージドBeanのすべてと他のすべてのサブクラスを抽象化し、ベースマネージドBeanの上に独自の実装をオーバーライド/追加します。両方のサブクラス (A と B) の機能を新しいサブクラス (C) に追加する必要があるという新しい要件が追加されました。

4

4 に答える 4

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 に答える
1

何も複製する必要がないように、含めてからデリゲートにしましょCABextend 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 に答える