軟體設計原則 黎克特制代換原則

2021-10-19 17:40:14 字數 1972 閱讀 8210

黎克特制代換原則是物件導向設計的基本原則之一。

黎克特制代換原則:任何基類可以出現的地方,子類一定可以出現。

通俗理解:子類可以擴充套件父類的功能,但不能改變父類原有的功能。

換句話說,子類繼承父類時,除新增新的方法完成新增功能外,盡量不要重寫父類的方法。

如果通過重寫父類的方法來完成新的功能,這樣寫起來雖然簡單,但是整個繼承體系的可復用性會比較差,

特別是運用多型比較頻繁時,程式執行出錯的概率會非常大。

下面看乙個黎克特制替換原則中經典的乙個例子

【例】正方形不是長方形。

在數學領域裡,正方形毫無疑問是長方形,它是乙個長寬相等的長方形。

所以,我們開發的乙個與幾何圖形相關的軟體系統,就可以順理成章的讓正方形繼承自長方形。

* @description: 長方形類

* @author: dym

*/public class rectangle

public void setlength(double length)

public double getwidth()

public void setwidth(double width)

}

package com.itheima.principles.demo2.before;

/** * @version v1.0

* @classname: square

* @description: 正方形類

* @author: dym

*/public class square extends rectangle

@override

public void setwidth(double width)

}

package com.itheima.principles.demo2.before;

/** * @version v1.0

* @classname: rectangledemo

* @description: todo(一句話描述該類的功能)

* @author: dym

*/public class rectangledemo

//擴寬方法

public static void resize(rectangle rectangle)

}//列印長和寬

public static void printlengthandwidth(rectangle rectangle)

}

我們執行一下這段**就會發現,假如我們把乙個普通長方形作為引數傳入resize方法,就會看到長方形寬度逐漸增長的效果,當寬度大於長度,**就會停止,這種行為的結果符合我們的預期;假如我們再把乙個正方形作為引數傳入resize方法後,就會看到正方形的寬度和長度都在不斷增長,**會一直執行下去,直至系統產生溢位錯誤。所以,普通的長方形是適合這段**的,正方形不適合。 我們得出結論:在resize方法中,rectangle型別的引數是不能被square型別的引數所代替,如果進行了替換就得不到預期結果。

因此,square類和rectangle類之間的繼承關係違反了黎克特制代換原則,它們之間的繼承關係不成立,正方形不是長方形。

抽象出來乙個四邊形介面(quadrilateral),讓rectangle類和square類實現quadrilateral介面

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

liskov substitution principle 黎克特制替換原則 定義 如果對每一型別為t1的物件o1,都有型別為t2的物件o2,使得以t1定義的所有程式p在所有的物件o1都替換成o2時,程式p的行為沒有發生變化,那麼型別t2是型別t1的子型別。擴充套件 乙個軟體實體如果適用乙個父類的話...

黎克特制代換原則

黎克特制代換原則 liskov substitution principle lsp 物件導向設計的基本原則之一。黎克特制代換原則中說,任何基類可以出現的地方,子類一定可以出現。lsp是繼承復用的基石,只有當衍生類可以替換掉基類,軟體單位的功能不受到影響時,基類才能真正被復用,而衍生類也能夠在基類的...

黎克特制代換原則

黎克特制代換原則 黎克特制代換原則 子型別必須能夠替換掉它們的父型別。就是說乙個軟體實體,如果使用的是乙個父類的話,那麼一定適用於其子類,而且,它覺察不出父類物件和子類物件的區別,也就是說,在軟體裡面,把父類都替換成它的子類,程式的行為沒有變化。只有當子類可以替換掉父類,軟體單位的功能不收到影響時,...