面象物件設計6大原則之三:里氏替換原則

茅坤寶駿氹發表於2018-05-05

轉載自 面象物件設計6大原則之三:里氏替換原則


里氏替換原則LSP),The Liskov Substitution Principle


定義

所有引用基類的地方必須能透明地引用其子類的物件,即子類可以擴充父類的功能,但不能修改父類已有的功能。


也就是說在父類出現的地方子類也可以出現,並且替換為子類也不會報錯,引用者根本不需要知道引用的是父類還是子類,但是反過來就行不通了,子類出現的地方父類就不一定能出現並代替子類。


里氏替換原則的特點:

1、子類可以擴充父類的功能,但不能修改父類已有的功能,如果修改了父類已有的功能,可能導致父類定義的功能在子類覆蓋後不適用。

2、過載父類的方法時,子類的方法形參應該比父類更寬鬆。

3、實現父類的抽象方法時,子類的方法輸出結果應該比父類更加嚴格。

4、子類可以有自己獨特的私有方法,但是需要注意的是,如果子類不能完全實現父類的方法,或者父類的某一些方法在子類中已經不適用,這種情況則建議斷開父子關係,使用組合等方式代替繼承出現。


里氏替換原則的優缺點:

1、合理得用類的繼承關係,提高了程式碼的複用性,但也增強了類與類之間的耦合性。

2、通過建立抽象,執行過程中具體實現取代抽象,保證了系統的可擴充性。

3、只要繼承父類就擁有父類的全部屬性和方法,這樣減少了程式碼重複建立量共享了程式碼但也約束了子類的行為,降低了系統靈活性。


我們平時開發中可能沒考慮這麼多,亂覆蓋父類的方法,沒有多少聯絡的繼承等很多打破了里氏替換的原則,這樣不顧後果的後果就是我們寫的程式存在著潛在的漏洞,而且出問題的機率也會顯著提升。



相關文章