java模擬多重繼承,且避免重複程式碼的方法
阿新 • • 發佈:2018-12-26
眾所周知,java是一門不支援多重繼承的語言,每當在java中談及多重繼承,人們都會說起介面。
然而一般理解之下,既然是介面,裡面的方法是不能有具體實現的,頂多也就起到一個規範的作用嘛,這樣豈不是還會造成程式碼的大量重複?
但是事實上並非如此,利用類的組合關係,即可很好地避免程式碼重複,同時也起到了程式碼的規範化,而類也在邏輯上實現了多重繼承。
下面來舉一個例子:
交通工具的基類:Vehicle
陸地交通工具:GroundVehicle
水上交通工具:WaterVehicle
水陸兩用交通工具:CommonVehicle
一般來說,陸地交通工具與水上交通工具都需要繼承於交通工具(Vehicle),但是誰陸兩用交通工具呢?只能繼承於一個父類呀,怎麼辦?難道繼承某一個,然後另一個就全部再複製一遍?
並不需要,請看類圖:
如圖所示,我們新建了一個IWaterVehicle介面,而水陸兩用交通工具CommonVehicle實現了該介面的同時,也與水上交通工具有組合關係。
水上交通工具需要的方法全部申明於IWaterVehicle介面中,實現於WaterVehicle類中,而對於CommonVehicle類來說,裡面包含了一個WaterVehicle類的物件,而實現介面中規定的方法時,只需要呼叫物件裡的對應方法即可。
舉個栗子:
IWaterVehicle介面:
public interface IWaterVehicle{
public run();
}
WaterVehicle類:
public WaterVehicle implments IWaterVehicle{
public run(){
System.out.println("run on water");
}
}
CommonVehicle類:
public CommonVehicle extends GroundVehicle implments IWaterVehicle{
/*
* 繼承方面的程式碼省略
*/
//定義一個WaterVehicle物件————體現了組合關係
WaterVehicle wVehicle = new WaterVehicle();
//實現介面中定義的方法
public run(){
//這裡直接呼叫wVehicle物件的方法,避免了重複程式碼
wVehicle.run();
}
}