我們都知道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方法。
問題:
- 你不覺得這是有這樣一個框架是一個好主意?
- 這樣的框架已經存在嗎?告訴我在哪裏/什麼。
- 有沒有一個eclipse插件呢?
- 是否有任何關於此類註釋框架的提案或計劃?
如果註解/插件框架允許我指定boolean,int或其他任何需要從String轉換併爲我進行轉換/解析的情況,那也將很美妙。
請指教,有人。我希望我的問題的措辭足夠清楚。謝謝。
編輯: 爲了避免OO愛好者跳到結論,我已經改名爲這個問題的標題。
不是一個真正的問題,而是嘗試開始討論。作爲一個問題處理這個問題,我的答案是1)否,2)AFAIK否,3)AFAIK不,4)AFAIK號 – 2010-02-18 10:02:15
我不會從其中一個類擴展,然後使用其他類的組合。如果你需要polymorhpism,做三個接口並且實現它們三個並且帶你Vehicle類使它成爲一個抽象的(或不是)車輛並且使用合成來訪問它的方法。 爲什麼選擇Vehicle而不是Machine或Transport來繼承?這樣你只能做到這一點 List list = new ArrayList (); list.add(new Car()) –
Lombo
2010-02-18 10:13:30
我認爲對這樣一個框架的需求是一個糟糕的類設計。也許你正在用錯誤的方式使用你想要的框架?嘗試使用更多的接口:) – Janusz 2010-02-18 10:15:50