2010-02-18 76 views
0

我們都知道Java爲什麼/不應該有多重繼承。所以這並不是質疑什麼已經被辯論,直到奶牛回家。Java多類合成和鍋爐板減少

這討論了當我們希望創建一個具有兩個或更多其他類的特性的類時,我們會做什麼。

也許,我們大多數人會這樣做,從三類「繼承」。爲簡單起見,我離開了構造函數:

class Car 
extends Vehicle 
{ 
    final public Transport transport; 
    final public Machine machine; 
} 

這樣,汽車類直接繼承的方法和汽車類的對象,但都將不得不提及運輸和機器明確指在運輸和機實例化的對象。

Car car = new Car(); 
car.drive(); // from Vehicle 
car.transport.isAmphibious(); // from Transport 
car.machine.getCO2Footprint(); // from Machine 

我認爲這是一個好主意,直​​到當我遇到需要setter和getter方法的框架。例如,XML

<Car amphibious='false' footPrint='1000' model='Fordstatic999'/> 

會尋找方法 setAmphibious(..),setFootPrint(..)和則setModel(..)。因此,我必須預測傳輸和機器類的方法

class Car 
extends Vehicle 
{ 
    final public Transport transport; 
    final public Machine machine; 
    public void setAmphibious(boolean b){ 
    this.transport.setAmphibious(b); 
    } 
    public void setFootPrint(String fp){ 
    this.machine.setFootPrint(fp); 
    } 
} 

這是好的,如果只有幾個特徵。現在,我正在嘗試將所有SmartGWT調整爲GWT UIBinder,特別是那些不是GWT Widget的類。項目有很多特點。

那豈不是很好,如果存在某種形式的註解框架是這樣的:

class Car 
extends Vehicle 
@projects {Transport @projects{Machine @projects Guzzler}} 
{ 
    /* No need to explicitly instantiate Transport, Machine or Guzzler */ 
    .... 
} 

凡在特性的通用名稱的情況下存在,機器的特性將優先高油耗的,而運輸公司將優先於機器公司,而車輛公司優先於運輸公司。然後,註釋框架將實例化Transport,Machine和Guzzler作爲Car的隱藏成員,並擴展以按照由@project註釋序列指定的優先級將受保護/公共特性分解爲實際源代碼或字節代碼。最好轉換成字節碼。因此,在Machine和Guzzler中都可以找到setFootPrint方法,所以只能投影機器的setFootPrint方法。

問題:

  1. 你不覺得這是有這樣一個框架是一個好主意?
  2. 這樣的框架已經存在嗎?告訴我在哪裏/什麼。
  3. 有沒有一個eclipse插件呢?
  4. 是否有任何關於此類註釋框架的提案或計劃?

如果註解/插件框架允許我指定boolean,int或其他任何需要從String轉換併爲我進行轉換/解析的情況,那也將很美妙。

請指教,有人。我希望我的問題的措辭足夠清楚。謝謝。

編輯: 爲了避免OO愛好者跳到結論,我已經改名爲這個問題的標題。

+2

不是一個真正的問題,而是嘗試開始討論。作爲一個問題處理這個問題,我的答案是1)否,2)AFAIK否,3)AFAIK不,4)AFAIK號 – 2010-02-18 10:02:15

+0

我不會從其中一個類擴展,然後使用其他類的組合。如果你需要polymorhpism,做三個接口並且實現它們三個並且帶你Vehicle類使它成爲一個抽象的(或不是)車輛並且使用合成來訪問它的方法。 爲什麼選擇Vehicle而不是Machine或Transport來繼承?這樣你只能做到這一點 List list = new ArrayList (); list.add(new Car()) – Lombo 2010-02-18 10:13:30

+0

我認爲對這樣一個框架的需求是一個糟糕的類設計。也許你正在用錯誤的方式使用你想要的框架?嘗試使用更多的接口:) – Janusz 2010-02-18 10:15:50

回答

3

您正在尋找的也許不完全是,但你可以看看混入:

+1

有趣的東西,但國際海事組織可能是一種討厭。在mixin方面,值得一提的是Groovy(正如你所知)是一個帶有mixins的Java超集(http://groovy.codehaus.org/Runtime+mixins) – 2010-05-23 23:58:20

0

一些框架(至少Spring)支持爲setter和gett指定路徑ERS。所以二傳看起來更像

<property name="transport.amphibious" value="true" /> 

你應該看看你是否可以使用這些選項。

+0

我現在專門致力於將SmartGWT適配到UIBinder,你推薦的東西在UIBinder中是可以撤消的。 – 2010-02-18 18:30:33