2011-08-29 142 views
3

我非常清楚地知道,它可以與接口的幫助下完成的,我已經做了很多次。但是這次我的情況很不一樣。我有class Aclass B,我需要創建另一個class C延伸A和B,因爲C應該有boths功能,並且還指出,A和B都沒有相互關聯的所以即使我不能說A可擴展class B如何創建一個類,「擴展」兩個現有的具體類

我很困惑我應該馬上做。我知道我們不能改變java ......但至少會有某種可能。即使是最近的也可以......請幫助我。

中添加更多細節: -Class B是一個標準的API,而class A是需要所有異常類繼承一個共同的異常類。

相關問題:

+1

,如果你有超過'類A'和'類B'控制請將我們知道幫助。 –

+0

[爲什麼在Java中沒有多重繼承,但允許實現多個接口](http://stackoverflow.com/questions/2515477/why-there-is-no-multiple-inheritance-in-java-但實施多接口) – Riduidel

+1

@ riduidel這是不可能的重複...請不要關閉這個問題。 – amod

回答

11

這是使用object composition通常解決。

這也是有效的Java,項目16中提倡的:贊同繼承

爪哇從具有 -relation兩個(無關)類限制的類。它但是從具有功能兩個不相關的類限制的類。


class A { 
    void doAStuff() { 
     System.out.println("A-method"); 
    } 
} 

class B { 
    void doBStuff() { 
     System.out.println("B-method"); 
    } 
} 

// Wraps an A and a B object. 
class C { 
    A aObj; 
    B bObj; 

    void doAStuff() { 
     aObj.doAStuff(); 
    } 

    void doBStuff() { 
     bObj.doBStuff(); 
    } 
} 

(或者你可以有class C extends A只有創造B包裝方法,但請記住,它應該是有意義的說C是一個


我有需要遵循一種設計模式,併爲它的強制延長

這是,你可能知道完全不可能的。然而,您可以爲AB創建代理類,將代理功能委託給C -instance。例如通過添加這兩種方法,以上述C -class:

class C { 

    // ... 

    public A asAObject() { 
     return new A() { 
      @Override 
      void doAStuff() { 
       C.this.doAStuff(); 
      } 
     }; 
    } 

    public B asBObject() { 
     return new B() { 
      @Override 
      void doBStuff() { 
       C.this.doBStuff(); 
      } 
     }; 
    } 
} 
+1

另外,你可以提取A和B的接口,使C實現它們 - 如果改變其中A和B是用來使用的接口,而不是代碼,你可以在那裏堅持℃;) – oenone

+1

燁...如果他掌握了相關的課程,這是一個非常好的方法。 – aioobe

+2

_Favor組成了inheritance_我的一個favourits :-) – Wivani

3

不可能擴展兩個類,並且因此從兩個繼承的功能性,在Java中。最簡單的替代方法是「包裝」至少兩個課程中的一個。因此,不是也擴展B,而是可以在C中有一個B實例,並在C上聲明B的每個方法,並將它們傳遞給它們。 C不會「成爲」B,但它聽起來像你只是想繼承功能。如果A也是這樣,那麼,你應該爲A和B使用這種模式,而不是擴展。

+0

感謝您的答覆,但我不想唯一的功能我有需要遵循和它的強制性延長的設計模式。 – amod

+1

在我的回答中對此進行了評論。 – aioobe

+0

你不能「有一個需要遵循的設計模式」。這是沒有意義的!你應該嘗試告訴我們你想要什麼(想要完成),然後我們可以幫助你解決你的問題。 –

1

利用組合物。 C類將包​​含一個實例的每個類A和B.

1

您可以嘗試創建class C將包含和class A一個實例和class B一個他們的方法(創建具有相同名稱的方法,這將只是調用從A方法和B),它被稱爲組合 - 與繼承相反的另一種方法。當然,如果你不需要instanceofC類一起工作,那就是如此。

1

一個常見的oop原理是「選擇合成而不是繼承」,因爲你不能擴展2個類,我建議把這些類中的一個或兩個都作爲C類的成員,當然如果這適用於什麼你正在努力去做。

1

也許你可以創建一個新的類d,並有來自d兩個A類和B類繼承?

1

改變你的想法。在接口中思考。這意味着類A實際上是接口A'的實現,而類B是接口B'的實現。而且你實際上需要一個實現接口A'和B'的C類。 C類不需要擴展任何東西或使用任何特定的模式或任何方式。它可以擴展A並將一些方法委託給B,或者它可以擴展B並將一些方法委託給A.或者它可以將所有方法委託給A和B - 實現是您的決定。

+0

對於例外情況無效......他希望有一個例外情況的基礎,但我覺得他實際上並不知道他想要什麼。 –