三、注意事項和細節
參考我們平時說的繼承,它有另一層含義
黎克特制替換原則定義
我們使用乙個加減法的例子來說明
建立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...