1. 程式人生 > >里氏替換原則的優點,理解,以及使用

里氏替換原則的優點,理解,以及使用

什麼是里氏替換原則呢?它有兩種定義:
● 第一種定義,也是最正宗的定義:If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T,the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.(如果對每一個型別為S的物件o1,都有型別為T的對 象o2,使得以T定義的所有程式P在所有的物件o1都代換成o2時,程式P的行為沒有發生變 化,那麼型別S是型別T的子型別。)
● 第二種定義:Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.(所有引用基類的地方必須能透明地使用其子類的物件。)

第二個定義是最清晰明確的,通俗點講,只要父類能出現的地方子類就可以出現,而且替換為子類也不會產生任何錯誤或異常,使用者可能根本就不需要知道是父類還是子類。但是,反過來就不行了,有子類出現的地方,父類未必就能適應。

里氏替換原則為良好的繼承定義了一個規範,一句簡單的定義包含了4層含義。
1.子類必須完全實現父類的方法

2.子類可以有自己的個性:從里氏替換原則來看,就是有子類出現的地方父類未必就可以出現。

3.覆蓋或實現父類的方法時輸入引數可以被放大

4. 覆寫或實現父類的方法時輸出結果可以被縮小
 

在專案中,採用里氏替換原則時,儘量避免子類的“個性”,一旦子類有“個性”,這個子 類和父類之間的關係就很難調和了,把子類當做父類使用,子類的“個性”被抹殺——委屈了 點;把子類單獨作為一個業務來使用,則會讓程式碼間的耦合關係變得撲朔迷離——缺乏類替換的標準。