2013-04-16 68 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(); 
    } 
}