黎克特制替換原則

2021-06-22 20:25:29 字數 1289 閱讀 2186

黎克特制替換原則       

黎克特制代換原則(liskov substitution principle lsp)物件導向設計的基本原則之一。 黎克特制代換原則中說,任何基類可以出現的地方,子類一定可以出現。 lsp是繼承復用的基石,只有當衍生類可以替換掉基類,軟體單位的功能不受到影響時,基類才能真正被復用,而衍生類也能夠在基類的基礎上增加新的行為。黎克特制代換原則是對「開-閉」原則的補充。實現「開-閉」原則的關鍵步驟就是抽象化。而基類與子類的繼承關係就是抽象化的具體實現,所以黎克特制代換原則是對實現抽象化的具體步驟的規範。

現在我們來實現乙個兩個數相減的功能,建造乙個類funa

public class funa 

}

實現類funa的測試testdemo

public class testdemo 

}

結果很顯而易見

100-30=70

20-40=-20

當我們要實現兩個數相加,和兩數相加然後再加上100我們通過類funb來實現,funb繼承自funa

public class funb extends funa 

public int funadd(int a,int b)

}

同樣測試一下

public class testdemo 

}

結果輸出的是

100-30=130

20-40=60

20+40+100=160

很明顯其實現的是子類funb的功能,原因就是類b在給方法起名時無意中重寫了父類的方法,造成所有執行相減功能的**全部呼叫了類b重寫後的方法,造成原本執行正常的功能出現了錯誤。在本例中,引用基類a完成的功能,換成子類b之後,發生了異常。在實際程式設計中,我們常常會通過重寫父類的方法來完成新的功能,這樣寫起來雖然簡單,但是整個繼承體系的可復用性會比較差,特別是運用多型比較頻繁時,程式執行出錯的機率非常大。如果非要重寫父類的方法,比較通用的做法是:原來的父類和子類都繼承乙個更通俗的基類,原有的繼承關係去掉,採用依賴、聚合,組合等關係代替。

黎克特制替換原則通俗的來講就是:子類可以擴充套件父類的功能,但不能改變父類原有的功能。它包含以下4層含義

1、子類可以實現父類的抽象方法,但不能覆蓋父類的非抽象方法。

2、子類中可以增加自己特有的方法。

3、當子類的方法過載父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入引數更寬鬆。

4、當子類的方法實現父類的抽象方法時,方法的後置條件(即方法的返回值)要比父類更嚴格。

黎克特制替換原則

黎克特制替換原則更多的說的是子類與父類的關係的一種原則,子類必須實現父類的所有方法,所有能夠放子類的地方一定能夠放父類。但是這裡的話,我們講有的時候在我們的業務中,有的子類肯定是有個性化的特徵的,比如真槍和玩具槍,真槍能射出子彈,但是玩具槍就不能,那麼這個時候,我們或者通過抽象類,通過抽象類是我們可...

黎克特制替換原則

黎克特制替換原則,主要是乙個關於繼承的規範原則,它要求我們在軟體中寫繼承關係時,所有引用父類的地方必須能夠 透 明地使用其子類物件 子類可以實現父類所提供的抽象 方法,但不要去重寫父類已經實現的方法,或者過載父類的 構 造。要維護繼承的傳遞性,當然很多地方為這個原則打了個 比喻為 龍生龍,鳳生鳳,老...

黎克特制替換原則

黎克特制替換原則 lsp 原則上來說子類物件介意賦給父類物件,也可以說子類替換父類,並且出現在父類能夠出現的任何地方 反過來說,父類物件是不能替換子類物件的,這種特性稱為黎克特制替換原則 1.子類可以隱式的轉換父類 2.父類必須強轉子類 is as is 相當與判斷。a is b a 是不是 b 或...