黎克特制代換原則:如果對每乙個型別為t1的物件o1,都有型別為t2的物件o2,使得以t1定義的所有程式p在所有的物件o1都代換成o2時,程式p的行為沒有變化,那麼型別t2是型別t1的子型別。換言之,乙個軟體實體如果使用的是乙個基類的話,那麼一定使用於其子類,而且它根本不能察覺出基類和子類物件的區別。比如,假如有兩個類,乙個是b類,另乙個i類,並且i類是b類的子類。那麼乙個方法如果可以接受乙個基類物件b的話:
method(b b)那麼它必然可以接受乙個子類物件i,也就是可以有method(i)。
黎克特制代換原則是繼承復用的基石。只有當衍生類可以替換掉基類,軟體單位的功能不會受到影響時,基類才能真正被復用,而衍生類也才能夠在基類的基礎上增加新的行為。
黎克特制代換原則反過來是不成立的。
黎克特制代換原則在設計模式中的體現
策略模式
**模式
合成模式
從**重構的角度理解
黎克特制代換原則講的是基類與子類的關係。只有當這種關係存在時,黎克特制代換原則才存在;反之則不存在。如果有兩個具體類a和b之間的關係違反了黎克特制代換原則的設計,根據具體情況可以在下面的兩種重構方案中選擇一種:
(1)建立乙個新的抽象類c,作為兩個具體類的超類,將a和b的共同行為移動到c中,從而解決a和b行為不完全一致的問題,如下圖所示:
(2)從b到a的繼承關係改寫為委派關係,如圖所示:
存在rectangle和square兩個類
package lsp;
/** * created by administrator on 2016/12/29.
*/public class rectangle
public long getwidth()
public long getheight()
public void setheight(long height)
}package lsp;
/** * created by administrator on 2016/12/29.
*/public class square
public void setside(long side)
}package lsp;
/** * created by administrator on 2016/12/29.
*/public inte***ce quadrangle
package lsp;
/** * created by administrator on 2016/12/29.
*/public class rectangle implements quadrangle
public long getwidth()
public long getheight()
public void setheight(long height)
}package lsp;
/** * created by administrator on 2016/12/29.
*/public class square implements quadrangle
public void setside(long side)
public long getwidth()
public long getheight()
}
黎克特制代換原則
黎克特制代換原則 liskov substitution principle lsp 物件導向設計的基本原則之一。黎克特制代換原則中說,任何基類可以出現的地方,子類一定可以出現。lsp是繼承復用的基石,只有當衍生類可以替換掉基類,軟體單位的功能不受到影響時,基類才能真正被復用,而衍生類也能夠在基類的...
黎克特制代換原則
黎克特制代換原則 黎克特制代換原則 子型別必須能夠替換掉它們的父型別。就是說乙個軟體實體,如果使用的是乙個父類的話,那麼一定適用於其子類,而且,它覺察不出父類物件和子類物件的區別,也就是說,在軟體裡面,把父類都替換成它的子類,程式的行為沒有變化。只有當子類可以替換掉父類,軟體單位的功能不收到影響時,...
黎克特制代換原則
黎克特制代換原則 子型別必須能替換掉它們的父型別.只有當子類可以替換掉父類,軟體單位的功能不受到影響時,父類才能真正的被復用,而子類也能夠在父類的基礎上增加新的行為.比如說,貓類繼承動物類,動物類擁有吃喝叫跑等行為,當某一天,我們需要狗,牛,羊也擁有類似的行為,由於它們都是繼承於動物,所以除了更改例...