【32】確定你的public繼承塑模出Is-A關係

Andy Niu發表於2014-01-02

1、public繼承表示Is-A關係,也就是滿足里氏代換。與之相對應的,private繼承表示根據某物實現出,不滿足里氏代換。子類物件初始化父類引用,編譯通不過。

2、考慮下面的需求,企鵝繼承鳥,Bird暴露virtual Fly介面。現在出問題了,因為Penguin不會飛,不提供Fly介面。怎麼辦?

  a、Penguin在重寫的Fly方法中,丟擲一個異常。

  b、上面的解決辦法不好,因為它表示的意義不是說Penguin不會飛,而是說嘗試讓Penguin飛,會出現錯誤。最大的問題是:執行期才發現錯誤。我們知道:好的介面可以防止無效的程式碼通過編譯。現在思考,解決解決這個問題。這個問題的關鍵是:並不是所有的鳥都會飛,因此Bird不應該暴露Fly介面。解決辦法就是:Bird不暴露Fly介面,Penguin也不暴露Fly介面,其他會飛的鳥暴露Fly介面。這樣,使用者就沒辦法對Penguin呼叫Fly介面。

3、再考慮矩形和正方形,從幾何角度講,正方形是一種矩形。從軟體設計角度講,正方形是矩形嗎?應該使用public繼承嗎?思考:對矩形可以單獨設定寬度,而不影響高度。但是對於正方形,設定寬度,要求高度隨之變化,否者就不是正方形了。因此不能使用public繼承。與此類似的還有:路徑是String嗎?路徑應該public繼承String嗎? 不能。因為一個String加上另一個String還是一個有效的String,而一個路徑加上另一個路徑就不是一個路徑了。

4、程式碼通過編譯,不代表可以正常執行。因此,應該儘早暴露出問題,好的介面應該防止無效的程式碼通過編譯。

相關文章