1. 程式人生 > >java模擬多重繼承,且避免重複程式碼的方法

java模擬多重繼承,且避免重複程式碼的方法

眾所周知,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(); } }
歡迎大家加入QQ群一起交流討論,「吟遊」程式人生——YinyouPoet