[Note] Effective Java #14 優先考慮 composition 然後才是 inheritance

主要討論的繼承是class extends class,不包含class implement interface或是interface extends interface。

繼承打破封裝性,superclass的實作如果改變,subclass即使沒有改變,依然會受到影響。繼承時,subclass如果override superclass的function時,當superclass的實作有修改時,對subclass有一定程度的影響,那是否不要override function,只新增function就不會有問題? 問題或許會比較少,但是依然無法保證完全不會有問題。
如果要解決上述的問題,較好的方式為使用composition(複合),不使用extends而在原為subclass中新增一private field,而該private field就是本來的superclass,程式的範例大約如下。當Car需要Wheel所提供的功能時,不適用inheritance而應用composition,當Car需要某部份來自Wheel的功能時,就應轉接給Wheel來做處理。
public class Car extends Wheel {
    ...
}

public class Car {
    private Wheel wheel;

    public String getWheelBrand() {
        return wheel.getWheelBrand();
    }
    ...
}
那什麼時候適合用inheritance呢? 當subclasss是一種superclass時就適用,例如鳥是一隻動物或是卡車是一種車,另外需要再思考的是用繼承時,API的缺點將會完整的傳遞給subclass,但是如果用composition時是有機會重新設計API的。

如果有錯誤,請留言告知,非常感謝。

沒有留言:

張貼留言