4 物件導向設計模式之黎克特制代換原則

2022-06-30 22:57:13 字數 1262 閱讀 1660

liskov substitution principle(黎克特制代換原則,lsp):子型別(subtype)必須能夠替換它們的基本型別。反過來的代換不成立。

例如有兩個類,乙個類為baseclass,另乙個類是subclass類,並且subclass類是baseclass的子類,那麼乙個方法如果可以接受乙個baseclass型別的基類物件base的話,如method1(base),那麼它必然可以接受乙個baseclass型別的子類物件sub,method1(sub)能夠正常執行。反過來的代換不成立,如乙個方法method2接受baseclass型別的子類物件sub為引數:method2(sub),那麼它一般而言不可以有method2(base),除非是過載方法。

黎克特制代換原則(liskov subsitution priniciple,lsp)有兩種定義方式,第一種定義方式相對嚴格,其定義如下:

如果對每個型別為s的物件o1,都有型別為t的物件o2,使得以t定義的所有程式p在所有的物件o1都代換成o2時程式p的行為沒有變化,那麼型別s是型別t的子型別。

第二種更容易理解的方式定義如下:

所有引用基類(父類)的地方都必須能透明的使用其他子類的物件。

黎克特制代換原則可以通俗的表述為:在軟體中如果能夠使用基類物件,那麼一定能夠使用其子類物件。把基類都替換成它的子類,程式將不會產生任何錯誤和異常,反過來則不成立,如果乙個軟體實體使用的是乙個子類的話,那麼它不一定能夠使用基類。

黎克特制代換原則是實現開閉原則的重要方式之一,由於使用基類物件的地方都可以使用子類物件,因此在程式中盡量使用基型別來物件進行定義,而在執行時在確定其子類行,用子類物件來替換父類物件。

當滿足繼承的使用,父類肯定存在非私有成員,子類肯定得到了父類的這些非私有成員(假設父類的成員全部是私有的,那麼子類沒辦法從父類繼承任何成員,也就不存在繼承的概念了)。既然子類繼承了父類的這些非私有成員,那麼父類物件也就可以在子類物件中呼叫這些非私有成員。所以,子類物件可以替換父類物件的位置。

只有當子類可以替換掉父類,軟體單位的功能不受到影響時,父類才能真正被復用,而子類也能夠在父類的基礎上增加新的行為。

由於有了黎克特制代換原則,才使得開閉原則成為可能。由於子型別替換性才使得使用父類行的模組在無需更改的情況下就可以擴充套件。否則就不能擴充套件開放,修改關閉。而依賴導致原則高層模組不依賴低層模組,兩者都應該依賴抽象。依賴倒置其實是誰也不依賴誰,除了約定介面,大家可以靈活自如。

繼承作為物件導向的三大特性之一,給程式帶來巨大遍歷的同時也帶來了一些弊端,它增加了物件之間的耦合性。因此在系統設計時,遵循黎克特制替換原則,盡量避免子類重寫父類的方法,可以有效降低**出錯的可能性。

拷貝

設計模式學習 三 物件導向設計模式之黎克特制替換原則

黎克特制替換原則定義 所有引用基類的地方必須能透明地使用其子類的物件。簡單來說,乙個軟體實體如果使用的是乙個父類的話,那麼一定適用於其子類,只要父類能夠出現的地方子類就可以出現,而且將父類替換為子類程式不會產生錯誤或異常,而且我們有可能察覺不出父類和子類物件的區別 相反的,如果乙個軟體實體如果使用的...

設計模式原則 依賴倒轉 黎克特制代換原則

設計模式一共有六大原則 單一原則 開放封閉原則 介面分離原則 黎克特制替換原則 最少知識原則 依賴倒置原則。依賴倒轉原則 高層模組不應該依賴於低層模組,兩者都應該依賴於抽象。抽象不應該依賴細節,細節應該依賴抽象。在物件導向程式設計領域中,依賴反轉原則 dependency inversion pri...

Java與設計模式(四)設計原則 黎克特制代換原則

黎克特制代換原則由2008年圖靈獎得主 美國第一位電腦科學女博士barbara liskov教授和卡內基 梅隆大學jeannette wing教授於1994年提出。其嚴格表述如下 如果對每乙個型別為s的物件o1,都有型別為t的物件o2,使得以t定義的所有程式p在所有的物件o1代換o2時,程式p的行為...