一直都搞不明白黎克特制替換原則的後面兩條,到今天才知道原來是自己沒有認真思考。閒話不說,記錄下來吧以後方便檢視。
黎克特制替換原則的主要作用就是規範繼承時子類的一些書寫規則。其主要目的就是保持父類方法不被覆蓋,試想一下,如果你想覆蓋父類的方法,幹嘛還要繼承他,直接重新寫乙個類不就完了。
黎克特制替換原則包含以下4層含義:
始終記住黎克特制替換原則的最終目的就可以,就是保持父類的方法不被覆蓋。所以前面兩層含義和最後一條很容易理解,重點記下我覺得比較難以理解的第三條。
第三條:
當子類覆蓋或實現父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入引數更寬鬆。
為了保持
所有引用基類的地方必須能透明地使用其子類的物件。舉例子說明:
父類乙個方法func(hashmap map);子類方法func(map map);
父類例項f,子類例項s,為了遵守保持所有引用基類的地方必須能透明地使用其子類的物件這一原則,f.func(hashmap或子類) 必須和s.func(hashmap或子類) 呼叫的是同一方法,試想如果子類方法func引數範圍比父類的窄的話,s.func就會優先呼叫子類的方法,這樣就違背了黎克特制替換原則的基本定義了。
如何理解黎克特制替換原則?
liskov替換原則核心就是子類能完全替換它的基類。看上去這個應該與生俱來的能力。物件導向的核心多型,不就是靠這一條實現的。或許從沒有遇到的過子類改寫基類的情況。程式世界可能出現這種情況,而且在不經意之間出現這種情況。比如 鳥 是基類,這個基類有乙個 飛翔 的行為。當 鴕鳥 繼承了 鳥 這就會引起麻...
黎克特制替換原則
黎克特制替換原則 黎克特制代換原則 liskov substitution principle lsp 物件導向設計的基本原則之一。黎克特制代換原則中說,任何基類可以出現的地方,子類一定可以出現。lsp是繼承復用的基石,只有當衍生類可以替換掉基類,軟體單位的功能不受到影響時,基類才能真正被復用,而衍...
黎克特制替換原則
黎克特制替換原則更多的說的是子類與父類的關係的一種原則,子類必須實現父類的所有方法,所有能夠放子類的地方一定能夠放父類。但是這裡的話,我們講有的時候在我們的業務中,有的子類肯定是有個性化的特徵的,比如真槍和玩具槍,真槍能射出子彈,但是玩具槍就不能,那麼這個時候,我們或者通過抽象類,通過抽象類是我們可...