前面的依賴倒轉原則有用到黎克特制代換原則,那我就廢話不多少說,直接來看看為什麼用黎克特制代換原則代替繼承吧。
定義1:子型別必須能夠替換掉它們的父型別。
定義2:如果對每乙個型別為 t1的物件 o1,都有型別為 t2 的物件o2,使得以 t1定義的所有程式 p 在所有的物件 o1 都代換成 o2 時,程式 p 的行為沒有發生變化,那麼型別 t2 是型別 t1 的子型別。
描述:乙個軟體實體如果使用的是乙個父類的話,那麼一定適用於其子類,而且它察覺不出父類物件和子類物件的區別,也就是說,在軟體裡面,把父類都替換成它的子類,程式的行為沒有變化
例子:在生物學分類上,企鵝是一種鳥,但在程式設計世界裡,企鵝卻不能繼承鳥。在物件導向設計時,子類擁有父類所有非private的行為和屬性,鳥會飛,但企鵝不會飛,所以企鵝不能繼承鳥類。
只有當子類可以替換掉父類,軟體單位的功能不受影響時,父類才能真正被復用,而子類也能夠在父類的基礎上增加新的行為,正是有黎克特制代換原則,使得繼承復用成為了可能。正是由於子型別的可替換性才使得使用父類型別的模組在無需修改的情況下就可以擴充套件,不然還談什麼擴充套件開放,修改關閉呢
乙個簡單的例子:武打劇中大腕兒一般都有武術替身。為安全考慮以及表演效果,某些時候一般都是由武替(子類)代替武術大腕兒(父類)來完成。
黎克特制替換原則通俗的來講就是:子類可以擴充套件父類的功能,但不能改變父類原有的功能。結合上面的例子,它包含以下4層含義:
1.子類可以實現父類的抽象方法,但不能覆蓋父類的非抽象方法。(武替可以代替大腕兒完成表演,但代替不了做明星) 2
.當子類的方法實現父類的抽象方法時,方法的後置條件(即方法的返回值)要比父類更嚴格。
(表演效果只能比大腕兒演的好) 3
.子類中可以增加自己特有的方法。
(武替也有自己的生活) 4
.當子類的方法過載父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入引數更寬鬆。
(武替比大腕兒更擅長表演武術)
黎克特制代換原則
黎克特制代換原則 liskov substitution principle lsp 物件導向設計的基本原則之一。黎克特制代換原則中說,任何基類可以出現的地方,子類一定可以出現。lsp是繼承復用的基石,只有當衍生類可以替換掉基類,軟體單位的功能不受到影響時,基類才能真正被復用,而衍生類也能夠在基類的...
黎克特制代換原則
黎克特制代換原則 黎克特制代換原則 子型別必須能夠替換掉它們的父型別。就是說乙個軟體實體,如果使用的是乙個父類的話,那麼一定適用於其子類,而且,它覺察不出父類物件和子類物件的區別,也就是說,在軟體裡面,把父類都替換成它的子類,程式的行為沒有變化。只有當子類可以替換掉父類,軟體單位的功能不收到影響時,...
黎克特制代換原則
黎克特制代換原則 子型別必須能替換掉它們的父型別.只有當子類可以替換掉父類,軟體單位的功能不受到影響時,父類才能真正的被復用,而子類也能夠在父類的基礎上增加新的行為.比如說,貓類繼承動物類,動物類擁有吃喝叫跑等行為,當某一天,我們需要狗,牛,羊也擁有類似的行為,由於它們都是繼承於動物,所以除了更改例...