里氏代換原則

里氏代換原則(Liskov Substitution Principle, LSP)

1、里氏代換原則定義

若對於每一個類型S的對象o1,都存在一個類型T的對象o2,使得在所有針對T編寫的程序P中,用o1替換o2後,程序P的行爲功能不變,則S是T的子類型。
What is wanted here is something like the following substitution property: 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.
即,一個軟件實體如果使用的是一個基類的話,那麼一定適用於其子類。而且它覺察不出基類對象和子類對象的區別。也就是說,在軟件裏面,把基類都替換成它的子類,程序的行爲沒有變化。反過來的代換不成立,如果一個軟件實體使用的是一個子類的話,那麼它不一定適用於基類。

2、里氏代換原則與“開-閉”原則的關係

實現“開-閉”原則的關鍵步驟是抽象化。基類與子類之間的繼承關係就是抽象化的體現。因此里氏代換原則是對實現抽象化的具體步驟的規範。違反里氏代換原則意味着違反了“開-閉”原則,反之未必。

3、里氏代換原則的四層含義

1)子類必須完全實現父類的方法。在類中調用其他類是務必要使用父類或接口,如果不能使用父類或接口,則說明類的設計已經違背了LSP原則。

2)子類可以有自己的個性。子類當然可以有自己的行爲和外觀了,也就是方法和屬性

3)覆蓋或實現父類的方法時輸入參數可以被放大。即子類可以重載父類的方法,但輸入參數應比父類方法中的大,這樣在子類代替父類的時候,調用的仍然是父類的方法。即以子類中方法的前置條件必須與超類中被覆蓋的方法的前置條件相同或者更寬鬆。

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

4、里氏代換原則在設計模式中的體現

策略模式(Strategy)

如果有一組算法,那麼就將算法封裝起來,使得它們可以互換。客戶端依賴於基類類型,而變量的真實類型則是具體策略類。這是具體策略焦色可以“即插即用”的關鍵。

合成模式(Composite)

合成模式通過使用樹結構描述整體與部分的關係,從而可以將單純元素與符合元素同等看待。由於單純元素和符合元素都是抽象元素角色的子類,因此兩者都可以替代抽象元素出現在任何地方。里氏代換原則是合成模式能夠成立的基礎。

代理模式(Proxy)

代理模式給某一個對象提供一個代理對象,並由代理對象控制對原對象的引用。代理模式能夠成立的關鍵,就在於代理模式與真實主題模式都是抽象主題角色的子類。客戶端只知道抽象主題,而代理主題可以替代抽象主題出現在任何需要的地方,而將真實主題隱藏在幕後。里氏代換原則是代理模式能夠成立的基礎。
5、總結
里氏代換原則是對開閉原則的擴展,它表明我們在創建基類的新的子類時,不應該改變基類的行爲。也就是不要消弱基類的行爲。

面向對象的設計關注的是對象的行爲,它是使用“行爲”來對對象進行分類的,只有行爲一致的對象才能抽象出一個類來。我經常說類的繼承關係就是一種“Is-A”關係,實際上指的是行爲上的“Is-A”關係,可以把它描述爲“Act-As”。

發佈了5 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章