软件设计原则——里氏代换原则
里氏代換原則
里氏代換原則是面向?qū)ο笤O(shè)計(jì)的基本原則之一。
里氏代換原則:任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)。
通俗理解:子類可以擴(kuò)展父類的功能,但不能改變父類原有的功能。
換句話說,子類繼承父類時,除添加新的方法完成新增功能外,盡量不要重寫父類的方法。
如果通過重寫父類的方法來完成新的功能,這樣寫起來雖然簡單,但是整個繼承體系的可復(fù)用性會比較差,
特別是運(yùn)用多態(tài)比較頻繁時,程序運(yùn)行出錯的概率會非常大。
下面看一個里氏替換原則中經(jīng)典的一個例子
【例】正方形不是長方形。
在數(shù)學(xué)領(lǐng)域里,正方形毫無疑問是長方形,它是一個長寬相等的長方形。
所以,我們開發(fā)的一個與幾何圖形相關(guān)的軟件系統(tǒng),就可以順理成章的讓正方形繼承自長方形。
Rectangle.java
package com.itheima.principles.demo2.before;/*** @version v1.0* @ClassName: Rectangle* @Description: 長方形類* @Author: dym*/ public class Rectangle {private double length;private double width;public double getLength() {return length;}public void setLength(double length) {this.length = length;}public double getWidth() {return width;}public void setWidth(double width) {this.width = width;} }Square.java
package com.itheima.principles.demo2.before;/*** @version v1.0* @ClassName: Square* @Description: 正方形類* @Author: dym*/ public class Square extends Rectangle {@Overridepublic void setLength(double length) {super.setLength(length);super.setWidth(length);}@Overridepublic void setWidth(double width) {super.setLength(width);super.setWidth(width);} }RectangleDemo.java
package com.itheima.principles.demo2.before;/*** @version v1.0* @ClassName: RectangleDemo* @Description: TODO(一句話描述該類的功能)* @Author: dym*/ public class RectangleDemo {public static void main(String[] args) {//創(chuàng)建長方形對象Rectangle r = new Rectangle();//設(shè)置長和寬r.setLength(20);r.setWidth(10);//調(diào)用resize方法進(jìn)行擴(kuò)寬resize(r);printLengthAndWidth(r);System.out.println("==================");//創(chuàng)建正方形對象Square s = new Square();//設(shè)置長和寬s.setLength(10);//調(diào)用resize方法進(jìn)行擴(kuò)寬resize(s);printLengthAndWidth(s);}//擴(kuò)寬方法public static void resize(Rectangle rectangle) {//判斷寬如果比長小,進(jìn)行擴(kuò)寬的操作while(rectangle.getWidth() <= rectangle.getLength()) {rectangle.setWidth(rectangle.getWidth() + 1);}}//打印長和寬public static void printLengthAndWidth(Rectangle rectangle) {System.out.println(rectangle.getLength());System.out.println(rectangle.getWidth());} }我們運(yùn)行一下這段代碼就會發(fā)現(xiàn),假如我們把一個普通長方形作為參數(shù)傳入resize方法,就會看到長方形寬度逐漸增長的效果,當(dāng)寬度大于長度,代碼就會停止,這種行為的結(jié)果符合我們的預(yù)期;假如我們再把一個正方形作為參數(shù)傳入resize方法后,就會看到正方形的寬度和長度都在不斷增長,代碼會一直運(yùn)行下去,直至系統(tǒng)產(chǎn)生溢出錯誤。所以,普通的長方形是適合這段代碼的,正方形不適合。 我們得出結(jié)論:在resize方法中,Rectangle類型的參數(shù)是不能被Square類型的參數(shù)所代替,如果進(jìn)行了替換就得不到預(yù)期結(jié)果。
因此,Square類和Rectangle類之間的繼承關(guān)系違反了里氏代換原則,它們之間的繼承關(guān)系不成立,正方形不是長方形。
如何改進(jìn)呢?此時我們需要重新設(shè)計(jì)他們之間的關(guān)系。
抽象出來一個四邊形接口(Quadrilateral),讓Rectangle類和Square類實(shí)現(xiàn)Quadrilateral接口
總結(jié)
以上是生活随笔為你收集整理的软件设计原则——里氏代换原则的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件设计原则——开闭原则
- 下一篇: 软件设计原则——依赖倒转原则