面向對象6大原則之里氏替換原則

         這是我之前對於面向對象6大原則的學習筆記,其中對里氏替換原則的理解不夠深刻,https://blog.51cto.com/zhangzhao/2396810

         根據百度百科的資料,里氏替換原則的定義爲:Liskov1987年提出了一個關於繼承的原則“Inheritance should ensure that any property proved about supertype objects also holds for subtype objects.”——“繼承必須確保超類所擁有的性質在子類中仍然成立。”也就是說,當一個子類的實例應該能夠替換任何其超類的實例時,它們之間才具有is-A關係。

         簡單來說,就是當子類替換其基類的時候,程序的行爲沒有發生任何變化。

         這就要求:

         1. 子類可以實現父類的抽象方法,但是不能重寫父類的非抽象方法。(這裏需要區分下重寫和重載的概念,重寫是指函數名相同,函數的簽名或者說參數類型相同;而重載是函數名相同,函數的簽名或者說參數類型不同,面嚮對象語言的多態性會在運行時根據傳入的實參類型自動匹配最適合的函數進行調用)

         2. 子類可以增加自己的特性。

         3. 子類的在重載父類方法時,方法的前置條件(形參)要比父類方法的輸入參數更寬鬆。這是因爲如果子類方法的參數範圍更小的話,在運行調用函數的時候,可能就會先調用子類的重載函數,這是違反里氏替換原則的。

         4. 重載父類方法時輸出結果(返回值)可以被縮小。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章