黎克特制替換原則

2021-07-12 00:17:14 字數 2280 閱讀 9416

黎克特制替換原則,主要是乙個關於繼承的規範原則,它要求我們在軟體中寫繼承關係時,

所有引用父類的地方必須能夠 透

明地使用其子類物件

,子類可以實現父類所提供的抽象

方法,但不要去重寫父類已經實現的方法,或者過載父類的 構

造。要維護繼承的傳遞性,當然很多地方為這個原則打了個

比喻為:「龍生龍,鳳生鳳,老鼠的兒子會打洞」

黎克特制替換原則,告訴我們,在軟體中將乙個父類物件替換成它的子類物件,程式將不會產生任何錯誤或異常的話,那 麼

這兩個物件才具有繼承關係,也就是is-a關係。當然,反過來說,使用子類物件的地方卻不一定都能使用其父類進 行替

換,我相信這個應該很好理解,子類擴充套件的地方,父類就是沒有辦法實現的。

為了遵循黎克特制替換原則,我們在軟體中通常有種寫法,在程式中我們採用父類的基本型別來對物件進行定義,而在運 行

時再確定其子類型別,目的就是用子類物件來替換父類物件,所以很多原則,實際上在我們平時寫**這個過程

中,就有了體現。

在使用黎克特制替換原則時,需要注意的事項有:

1、子類的所有方法必須要在父類中有所宣告,或者換句話說,就是子類必須實現父類中宣告的所有方法。為什

麼要有這個事項呢?其實很好理解,我們在寫程式時,經常用父類來宣告物件定義,這樣有助於保證系統的擴充套件性,

在執行時用子類物件來替換父類物件,那麼如果乙個方法只存在子類中,在父類中卻不提供對應的宣告,那麼父類對

物件如何去使用這個方法呢?

2、我們在使用黎克特制替換原則時,盡量把父類設計成抽象類或介面,讓子類繼承或實現其方法,執行時,由子類

物件替換掉父類物件,這樣提高我們程式的擴充套件性,如果需要擴充套件其他類,無須修改原有子類的**,只需要其他子

類繼承或實現對應的父類或父介面即可,黎克特制替換原則其實也是開閉原則的一種體現。

舉個符合替換原則的例子:

父類中,我們提供了2個方法,乙個eat(),例外乙個是breathe(),breathe()是乙個抽象方法,因為這是子類特有的擴

展方法,父類無須實現, 但需要宣告。eat()在父類中已經有過實現,那麼子類只需繼承即可,而無須重寫,確保繼承

的連貫性,老鼠的兒子不能連洞都不會打了,改去追狗了……。

**體現:

package yuanze;

/** * 將父類宣告為抽象類

* * @author administrator

* */

public abstract class super

}

子類:

package yuanze;

/** * 定義子類繼承父類

* * @author administrator

* */

public class child extends super

}

客戶端呼叫時:

package yuanze;

public class test

}

執行後的結果是:

我吃麵

也就是說:子類繼承父類後,無論繼承多少次,那麼只要eat(),那麼就一定得到的是「我吃麵」。如果子類重寫了父類

的eat()方法,那麼就可能出現「我跟著老婆走,我吃大公尺了!」的情況了,那就違背了黎克特制替換原則。可以這樣理解,

父類中凡是已經實現好方法,那就是需要你繼承著走的,那都是設計的一系列的規範和契約,如果任意去修改,就有

可能對整個繼承體系造成破壞。子類需要擴充套件的方法,一定要通知到自己的父類,也就是需要在父類中宣告。

通俗的說,這個原則就是:子類可以擴充套件父類的功能,但不能改變父類原有的功能。

1、子類可以實現父類的抽象方法,但不能覆蓋父類的非抽象方法(不能把y基因變成了z,o(∩_∩)o哈哈~)。

2、子類中可以增加自己特有的方法,但需要在父類中宣告(要跟到老婆走,是不先要給父親說些呢?)。

3、當子類的方法過載父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入引數更寬鬆,這個

從引數個數上考慮。

4、當子類的方法實現父類的抽象方法時,方法的後置條件(即方法的返回值)要比父類更加嚴格,如父類要

求返回list,那麼子類就應該返回list的實現arraylist,父類是採用泛型,那麼子類則不能採用泛型,而是具體的返 回。

黎克特制替換原則

黎克特制替換原則 黎克特制代換原則 liskov substitution principle lsp 物件導向設計的基本原則之一。黎克特制代換原則中說,任何基類可以出現的地方,子類一定可以出現。lsp是繼承復用的基石,只有當衍生類可以替換掉基類,軟體單位的功能不受到影響時,基類才能真正被復用,而衍...

黎克特制替換原則

黎克特制替換原則更多的說的是子類與父類的關係的一種原則,子類必須實現父類的所有方法,所有能夠放子類的地方一定能夠放父類。但是這裡的話,我們講有的時候在我們的業務中,有的子類肯定是有個性化的特徵的,比如真槍和玩具槍,真槍能射出子彈,但是玩具槍就不能,那麼這個時候,我們或者通過抽象類,通過抽象類是我們可...

黎克特制替換原則

黎克特制替換原則 lsp 原則上來說子類物件介意賦給父類物件,也可以說子類替換父類,並且出現在父類能夠出現的任何地方 反過來說,父類物件是不能替換子類物件的,這種特性稱為黎克特制替換原則 1.子類可以隱式的轉換父類 2.父類必須強轉子類 is as is 相當與判斷。a is b a 是不是 b 或...