細說設計模式七大原則(4) 黎克特制替換原則

2021-10-07 16:32:19 字數 1416 閱讀 3507

英文名:the liskov substitution principle, liskov

黎克特制替換原則通俗的來講就是:子類可以擴充套件父類的功能,但不能改變父類原有的功能。它包含以下4層含義:

問題由來:有一功能p1,由類a完成。現需要將功能p1進行擴充套件,擴充套件後的功能為p,其中p由原有功能p1與新功能p2組成。新功能p由類a的子類b來完成,則子類b在完成新功能p2的同時,有可能會導致原有功能p1發生故障。

解決方案:當使用繼承時,遵循黎克特制替換原則。類b繼承類a時,除新增新的方法完成新增功能p2外,盡量不要重寫父類a的方法,也盡量不要過載父類a的方法。原來的父類和子類都繼承乙個更通俗的基類,原有的繼承關係去掉,採用依賴,聚合,組合等關係代替.

【例1】 展示姓名和年齡

person 的基本資訊:

package com.lilair.liskov;

public

class

person

public

void

showmyself()

}

anglebaby的基本資訊:

package com.lilair.liskov;

public

class

anglebaby

extends

person

@override

public

void

showmyself()

}

展示anglebaby的姓名和年齡

package com.lilair.liskov;

public

class

test

}

結果展示:

我是小明老婆。。。。我最美
​ 我們發現原本執行正常的展示姓名和年齡的功能發生了錯誤。原因就是類anglebaby在給方法起名時無意中重寫了父類的方法,造成所有執行展示姓名和年齡功能的**呼叫了類anglebaby重寫後的方法,造成原本執行正常的功能出現了錯誤。在本例中,引用基類person完成的功能,換成子類anglebaby之後,發生了異常。

​ 繼承包含這樣一層含義:父類中凡是已經實現好的方法(相對於抽象方法而言),實際上是在設定一系列的規範和契約,雖然它不強制要求所有的子類必須遵從這些契約,但是如果子類對這些非抽象方法任意修改,就會對整個繼承體系造成破壞。而黎克特制替換原則就是表達了這一層含義。

​ 繼承作為物件導向三大特性之一,在給程式設計帶來巨大便利的同時,也帶來了弊端。比如使用繼承會給程式帶來侵入性,程式的可移植性降低,增加了物件間的耦合性,如果乙個類被其他的類所繼承,則當這個類需要修改時,必須考慮到所有的子類,並且父類修改後,所有涉及到子類的功能都有可能會產生故障。

設計模式七大原則 4 黎克特制替換原則

三 注意事項和細節 參考我們平時說的繼承,它有另一層含義 黎克特制替換原則定義 我們使用乙個加減法的例子來說明 建立a類,使其實現減法功能 classa public class client 執行結果為 100 50 50 現在新增乙個新功能,使兩數相加後再與100相加,且這個功能由b類實現,所以...

設計模式 七大原則 黎克特制替換原則

繼承包含這樣一層含義 父類中凡是已經實現好的方法,實際上是在設定規範和契約,雖然它不強制要求所有的子類必須遵循這些契約,但是如果子類對這些已經實現的方 法任意修改,就會對整個繼承體系造成破壞。繼承在給程式設計帶來便利的同時,也帶來了弊端。比如使用繼承會給程式帶來侵入性,程式的可移植性降低,增加物件間...

軟體設計七大原則 06 黎克特制替換原則

類圖 public class base public class child extends base public void method map map public class test 輸出 父類被執行 示例類圖 不符合黎克特制替換原則對方法入參的要求.png 示例 public clas...