如果這篇文章能夠幫到您,請給我一個免費的贊,謝謝QWQ! LSP原則並不難,但是有些地方就會把它說的很啰嗦,如果你對LSP還是感到疑惑,請往下看看。 先上代碼: public class Bird { public void fly(){} }public class Duck extends Bi ...
如果這篇文章能夠幫到您,請給我一個免費的贊,謝謝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)