如果這篇文章能夠幫到您,請給我一個免費的贊,謝謝QWQ!
LSP原則并不難,但是有些地方就會把它說的很啰嗦,如果你對LSP還是感到疑惑,請往下看看,
先上代碼:
public class Bird { public void fly(){} }
public class Duck extends Bird{}
乍一看,這段代碼沒啥問題,沒錯啊,鴨子是鳥,當然鴨子也會飛了!
可是我舉個反例:鴕鳥不是鳥嗎?那鴕鳥會飛嗎?明顯不會,
但鴕鳥也是鳥啊,我如果讓我的鴕鳥做鳥的子類,那我按你這么寫必須會飛了,這不矛盾了嗎?
寫代碼處處全是矛盾,那怎么行,,,所以計算機科學家研究出了一個原則,這就是LSP原則,
LSP原則:子類物件在程式中可以代替父類物件;(簡單理解:父親能做的,兒子也能做)
不是所有鳥都會飛,鴕鳥這個子類是無法代替父類物件的,因為它不會飛,上面這個設計違反了LSP原則,
下面我這么改,就符合LSP原則了:
public class Bird{} public class FlyingBirds extends Bird{ public void fly(){} } public class Duck extends FlyingBirds{} public class Ostrick extends Birds{}
鴨子是會飛的鳥,當然也是鳥;
鴕鳥是不會飛的鳥,但是鴕鳥是鳥;
現在邏輯就順暢多了!
一個好好利用LSP原則的代碼,一般有如下特性:
1.父親幾乎啥也不會,除了一些基本活動;兒子比父親懂得多,但是也會父親那些基本活動(在子類中增加方法,子類必須實作父類所有方法)
2.父親好好的,兒子也就好好的;父親的病一定比兒子的重(子型別重寫不能拋出額外的例外;父型別無例外,子型別重寫不能有例外)
這個例子來自于stackoverflow的高贊答案,有興趣的可以去自行搜索:哎呀 - 里氏替換原理的一個例子是什么?- 堆疊溢位 (stackoverflow.com)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/498978.html
標籤:設計模式
下一篇:優惠券的工廠與策略模式實作方案
