[心得整理] c# 物件導向程式 - 5.LSP 里氏替換原則

[心得整理] c# 物件導向程式 - 5.LSP 里氏替換原則

 

前言

SOLID原則的L有兩個原則,今天先介紹LSP 里氏替換原則,另一個L稍候片刻

里氏替換原則 - 現實生活面

LSP重點在說繼承時要注意的事項,那之前三大特性時有說
繼承在現實世界用物種比喻比較貼切
舉例,所有繼承鳥綱的生物無論是能飛老鷹,不能飛的雞,會游泳的企鵝
一定都是卵生,就是會孵蛋,不會例外

里氏替換原則 - 程式面

子類別必須可以替換父類別的功能

在設計class時要想到這方法真的是所有繼承的class都會用到嗎?
設計鳥綱的class,我們可以把卵生這方法放進去,因為所有繼承鳥綱
都要是卵生,那飛行呢,就不可以了,因為不是所有繼承鳥綱的生物都能飛
用一個會員系統來比喻,就是我設計有,註冊方法,登入方法,登出方法,忘記密碼方法
假設有個系統用不到忘記密碼時,A工程師就想反正 我這系統又不提供忘記密碼的功能
就拿來放方便A工程師測試用的刪除會員功能
然後有一天老闆要加入忘記密碼的功能時,B工程師發現已經寫好了,執行後就慘了

對我來說 
LSP 里氏替換原則是心法,在設計時要想好是要用class繼承
還是要用介面,讓有用到此功能去繼承介面就好

補充

當檢查null的時候 也算違反LSP , 可以用 Null Object Pattern 這樣就不需要檢查null
Nulls Break Polymorphism

結語

還是強調繼承是強耦合的行為,在繼承之前要想清楚

推薦閱讀

[ASP.NET]91之ASP.NET由淺入深 不負責講座 Day21 - LSP 里氏替換原則

OOP學習筆記 - SOLID的里氏替換原則(LSP)

 

如果內容有誤請多鞭策謝謝