设计模式原则之里氏替换原则
轉載自:https://mp.weixin.qq.com/s/Uq4g53cQ7YKAXP8TuRV2Gw
定義:?
?
????1:如果對每一個類型為 T1的對象 o1,都有類型為 T2 的對象o2,使得以 T1定義的所有程序 P 在所有的對象 o1 都代換成 o2 時,程序 P 的行為沒有發生變化,那么類型 T2 是類型 T1 的子類型。
?
????2:所有引用基類的地方必須能透明地使用其子類的對象
通俗來講:父類必須能夠使用子類替換
?
里氏替換原則能帶來哪些好處?
里氏替換原則能夠將對于基類中定義的所有子程序,用在它的任何一個派生類中時的含義都應該是相同的。這樣繼承才不會增加復雜度,基類才能真正被復用,而派生類也能夠在基類的基礎上增加新的行為。繼承帶來的復雜度就降低了。
針對基類編程可以提高代碼的復用性
?
?
如何保證遵循里氏替換原則
????繼承是保證里氏替換原則的前提,但是繼承也有不能滿足里氏替換原則的時候。此時我們可以采用如下兩種方法進行設計:
?
1、重新提取公共部分的方法
?????把沖突的派生類與基類的共部分提取出來作為一個抽象基類,然后分別繼承這個類。
?
2、改變繼承關系
?????即:從父子關系變為委派關系或兄弟關系。
?????可以把它們的一些公有特性提取到一個抽象接口,再分別實現。
?
例如:
????最初發送郵件的設計如下:
?
? 考慮到給普通人發送郵件和給VIP用戶發送郵件中的send方法中的代碼有重復,遵從里氏替換原則,我們將共有部分的代碼提取出來,并改變CommonCustomer和VIPCustomer的繼承關系。修改之后如下:
?
?
總結:
里氏替換原則通俗的來講就是:子類可以擴展父類的功能,但不能改變父類原有的功能。
子類可以實現父類的抽象方法,但不能覆蓋父類的非抽象方法。
子類中可以增加自己特有的方法。
當子類的方法重載父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入參數更寬松。
當子類的方法實現父類的抽象方法時,方法的后置條件(即方法的返回值)要比父類更嚴格。
?
?
?
?
轉載于:https://www.cnblogs.com/xingzc/p/9066867.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的设计模式原则之里氏替换原则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode 关于树的题目
- 下一篇: redis见解