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

2021-10-10 05:40:32 字數 1539 閱讀 2201

三、注意事項和細節

參考我們平時說的繼承,它有另一層含義

黎克特制替換原則定義

我們使用乙個加減法的例子來說明

建立a類,使其實現減法功能

classa}

public

class

client

}

執行結果為 :100 - 50 = 50

現在新增乙個新功能,使兩數相加後再與100相加,且這個功能由b類實現,所以這裡我們可以使b類直接繼承a類後再增加新功能就可以了。

classa}

class

bextends

apublic

intfun2

(int a,

int b)

}public

class

client

}

執行結果為:100-50 = 150

可以看到,我們在b類中給方法起名時,無意間重寫了父類的方法,因為a、b類是繼承關係,呼叫者因為想使用減法功能而呼叫了b類中重寫後的方法func1()時,就會造成功能異常。

我們可以建立乙個更通俗的基類base,使a、b類都繼承這個基類,這樣a、b類就不存在繼承關係了,呼叫者也不會像之前那樣呼叫了重寫的方法。

// 基類

class

base

class

aextends

base

}class

bextends

base

// 兩數相加後再加100

public

intfunc2

(int a,

int b)

// 使用a類中的減法

public

intfunc3

(int a,

int b)

}public

class

client

}

由於b類不再繼承a類,因此呼叫者不會再以為func1()是減法運算了。

在實際程式設計中,通過重寫父類方法的方法實現新功能確實很簡單,但是會降低整個體系的可復用性(特別是頻繁使用多型時),所以我們可以對其進行改造 :

個人覺得,子類不能改變父類原有的功能,指的是不能改變父類方法的用途,但其細節可以改變。

例如:類a有乙個排序方法sort(),用途是排序,細節上使用的是氣泡排序;子類b繼承類a,重寫方法sort(),用途不變還是排序,但細節上採用了快排方式。

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

英文名 the liskov substitution principle,liskov 黎克特制替換原則通俗的來講就是 子類可以擴充套件父類的功能,但不能改變父類原有的功能。它包含以下4層含義 問題由來 有一功能p1,由類a完成。現需要將功能p1進行擴充套件,擴充套件後的功能為p,其中p由原有功能...

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

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

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

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