2012-04-04 35 views
12

我有課,如:如何在java中包裝類並保存界面?

MyClass extends MyAbstractClass implement myInterface1, myInterface2,... 

我需要創建新類的附加字段:

MyType1 field1; 
MyType2 field2; 
....... 

似乎是正確的創建新類,將包裹MyClass的,如:

MyWrapClass { 
MyClass myClass=new MyClass(...); 
MyType1 field1; 
MyType2 field2; 
..... 

但用作myInterface1或myInterface2類型的MyWrapClass!

所以問題是:我應該聲明MyInterface1,myInterface2在MyWrapClass中需要的所有方法嗎?或者存在另一種方式? 謝謝。

+0

如果您需要創建一個帶有新字段的類,那麼您必須擴展原始類。有人告訴我,最好是創建接口的變量而不是類的變量,這是因爲您可以將接口的方法添加到接口中,而無需更改整個類的代碼,並且每個類都使用該類的一個實例。這個我還沒有得到很好的答案,但它可能有助於擴展課程和添加你想要做的新方法。 – 2014-01-26 21:05:51

回答

16

基本上有兩種方式。第一個是擴展基類:

public class MySubClass extends MyClass { 
    private MyType1 field1; 
    private MyType2 field2; 
.... 

第二個選擇是使用組成:

public class MySubClass implements myInterface1, myInterface2 { 
     private MyClass delegate; 
     private MyType1 field1; 
     private MyType2 field2; 

     // for all methods in myInterface1, myInterface2 
     public SomeType method1() { 
     return delegate.method1(); 
     } 
     ... 
} 

第二個選項是由許多Java大師推薦:

喬希布洛赫的書有效的Java第二版

  • 第16項:繼承遺產的恩賜組合
  • 項目17:設計和 文件繼承,否則禁止它不是自由地擴展現有的類

良好的面向對象設計。你的第一個本能應該是寫作。

又見http://en.wikipedia.org/wiki/Composition_over_inheritance

組成了繼承可以簡化業務領域類的初步設計,並提供長期更穩定的業務領域。它比繼承的優勢更能徹底地隔離利益,而不像後裔階層所描述的那樣。此外,在定義業務領域類時,通常會設計繼承模型,以便理解問題領域中的信息,而不一定反映各種系統對象的真實關係。

P.S:對組成自動生成的代碼被一些現代的IDE

3

保鮮膜別,只是子類:

class MySubClass extends MyClass { 
    MyType1 field1; 
    MyType2 field2; 
    ... 
2

假設你不能擴展MyClass的,則沒有出現,你可以有MyWrapClass和使用它像MyClass的沒有別的辦法。例如,爲了包裝實際的地圖,我必須實施地圖。它具有許多功能,並且必須實現您打算使用的每一個功能。這裏有一點餘地,因爲如果你不打算把它傳遞給你沒有寫的函數,你可以添加所有必需的方法,只實現你需要的方法。雖然多數情況並非如此。

或者,您可以編寫一個虛擬類,它實現調用封裝器的所有接口方法。然後你可以用你自己的實現覆蓋這個類,這樣你就可以重新使用一個包裝類而不必每次都實現所有的方法。

2

支持的假設不能擴展MyClass的,你希望能夠使用MyWrapClass類型myInterface1或myInterface2。你可以做到以下幾點:在myInterface1和myInterface2到MyClass的

MyWrapClass implement myInterface1, myInterface2,...{ 
    MyClass myClass=new MyClass(...); 
    MyType1 field1; 
    MyType2 field2; 

    methodInInterface1() { 
     myClass.methodInInterface1() 
    } 

    .... 

您委託的所有方法的實現。 我相信這就是所謂的構圖。

+0

@Eugen Retunsky你打敗了我。乾杯, – hongbo 2012-04-04 16:16:32