黎克特制代換原則是物件導向設計的基本原則之一。
黎克特制代換原則:任何基類可以出現的地方,子類一定可以出現。
通俗理解:子類可以擴充套件父類的功能,但不能改變父類原有的功能。
換句話說,子類繼承父類時,除新增新的方法完成新增功能外,盡量不要重寫父類的方法。
如果通過重寫父類的方法來完成新的功能,這樣寫起來雖然簡單,但是整個繼承體系的可復用性會比較差,
特別是運用多型比較頻繁時,程式執行出錯的概率會非常大。
下面看乙個黎克特制替換原則中經典的乙個例子
【例】正方形不是長方形。
在數學領域裡,正方形毫無疑問是長方形,它是乙個長寬相等的長方形。
所以,我們開發的乙個與幾何圖形相關的軟體系統,就可以順理成章的讓正方形繼承自長方形。
* @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是繼承復用的基石,只有當衍生類可以替換掉基類,軟體單位的功能不受到影響時,基類才能真正被復用,而衍生類也能夠在基類的...
黎克特制代換原則
黎克特制代換原則 黎克特制代換原則 子型別必須能夠替換掉它們的父型別。就是說乙個軟體實體,如果使用的是乙個父類的話,那麼一定適用於其子類,而且,它覺察不出父類物件和子類物件的區別,也就是說,在軟體裡面,把父類都替換成它的子類,程式的行為沒有變化。只有當子類可以替換掉父類,軟體單位的功能不收到影響時,...