2013-04-16 16 views
6

私はこの作業階層を既に持っており、プログラムは期待通りに動作します。基本的に私はBaseクラスのすべてを抽象化し、他のすべてのサブクラスは独自のメソッドを追加しました。該当するデザインパターン

abstract Class Base{ 
} 

class A extends Base{ 
    //new methods 
} 

class B extends Base{ 
    //new methods 
} 

すべてが後になるまで良く見えます(errr ...新しい要件が)私はJavaで、今 クラスAとBの両方を拡張している私は(このクラスCを呼び出すことができます)新しいクラスを持っている必要があり実現し、その2つの具体的なクラスを拡張することはできません。

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

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

おかげ

UPDATE これは、私は豆と他のすべてのサブクラスベース管理Beanの上に独自の実装を追加/上書きを管理ベースですべてを抽象化し、前記JSF管理対象Bean実際にあります。 私は新しいサブクラス(C)

+0

クラスの内容について詳しく説明していないと難しいですが、コンポーネントベースのデザインではうまくいくように思えます。 –

+6

あなたはメソッドが必要ですが、 'CはAとBです'という関係は必要ですか?あなたは作曲を使うことができますが、あなたの投稿はこれが適切かどうかを知るためにもっと多くの情報を必要とします。 –

+1

Yehは構成を考え、 'C'に' A'と 'B'のインスタンスを含んでいます。 –

答えて

4

あなたのコードをリファクタリングし、代わりにクラスや利用のABBaseインタフェースを作るに両方のサブクラス(AとB)の機能を必要な特徴を加えただけで、新たな要件があります実装の継承の代わりにインタフェースの継承。
その後、あなたはどちらか(これはJavaでサポートされてどのように多重継承である)

+1

@Mark Estradaは、クラスAとクラスBの両方のメソッドと変数が必要だと言っています。メンバー変数を持つように見えるため、AとBをインターフェイスに変更できません。 – codeMan

+0

@codeMan:メンバー変数は問題ではありません。彼は自分のコードを適切に再設計する必要があります。 – Cratylus

+1

彼は既存のコードを使用する代わりに、すべてのメソッドを再実装する必要があります。 –

3

ABの両方を実装する組成物を用いるか、内部クラスを使用することができます。

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

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

理想的には、インターフェイスとして、すべてのクラスA、Bおよびベースを作成する必要がありますが、上記の設計は、すでに私は、これは今オプションではありませんと仮定しています実装されたことを述べてきたように。

もう1つの解決策は、クラスC(構成)にタイプAまたはタイプBのインスタンスを作成することです。

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

また、Aを拡張し、

1

CABが含まれているが、またそれは、あなたがいないので、委任extend Baseを作ることができますBのインスタンスを作成するように継承と組成の両方を用いた混合アプローチを使用することができます何かを複製する必要があります。

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(); 
    } 
} 
関連する問題