介紹里氏替換原則的文章非常多,但可能大家看完之后,心中仍然留有疑問,如何去落地實現,如何判斷是否影響程序功能,本文將帶領大家深入理解里氏替換,一起領略下它的真正面目,但在此之前,有必要闡述一下,為什么會提出設計原則以及設計原則的作用,
什么是設計原則設計原則是指導代碼設計的經驗沉淀,其目的是為了提高軟件開發的可維護性,我們知道,程序世界并非一塵不染的,隨著業務的發展,之前所設計的流程,會為了適應業務而不斷調整改變, 對于開發來說,需要有業務前瞻性,凡事多往前考慮一步,盡量減少因為未來業務改變,而造成系統大范圍的改動,一旦大范圍改動,勢必造成開發和回歸的成本,所以開發的時候,多思考這樣的設計是否違背了某些原則,如果能盡量向上述的設計原則靠攏,就能達到可維護性的目的,常用的有以下設計原則,后續會逐步推出系列文章,一一講解
- SOLID原則
- SRP 單一職責原則
- OCP 開閉原則
- LSP 里式替換原則
- ISP 接口隔離原則
- DIP 依賴倒置原則
- DRY 原則
- KISS 原則
- YAGNI 原則
- LOD 法則
我們來正式討論本文主角,里氏替換原則,里氏替換原則的定義是
調用父類的地方,可以替換成調用子類,但是不會導致程序出錯
這里核心的點在于,替換之后,程序不會出錯,即不能導致程序邏輯錯誤,運行錯誤,
以我的理解,里氏替換原則對于代碼設計的約束可以分為兩個角度進行討論,方法結構的約束和方法邏輯約束,下面我們逐個深入討論
1. 方法結構的約束(方法定義)
1.1 輸入參數不能比父類嚴格
即入參只能是父類入參或者父類入參的父類,即如果父類方法的入參是 P 類,那么子類方法的入參只能是 P 類,或者 P 類的父類,
我們舉例說明一下, 下面的例子中, 我們定義了三個類, A,B, C, 其中 B 和 C 是 A 的子類,B 類的入參是P,比父類的寬松,滿足法則,而 C 類的入參是 P2,比父類的嚴格,不滿足法則,
之所以這樣做,是為了避免子類使用了更加寬松的入參類型中,特有的一些方法,而導致程序出錯,
比如下面的例子中,調用了 A 類的 test 方法,并且入參是 P 類,接著用 C 類替換
