里氏代换原则

一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类和子类对象的区别。也就是说,在软件里面,把父类替换成它的子类,程序的行为没有变化。一个软件实体如果使用的是一个子类的话,那
么它不能适用于其父类

一、里氏代换原则例子

1.1 Person
public class Person {public void display(){System.out.println("this is person");}
}
1.2 Man
public class Man extends Person {public void display(){System.out.println("this is man");}
}
1.3 MainClass

如果使用一个父类,一定适合其子类

public class MainClass {public static void main(String[] args){//如果使用一个父类,一定适合其子类Person person = new Person();display(person);Person man = new Man();display(man);}public static void display(Person person){person.display();}
}
1.4 MainClass

如果使用一个子类,不能适合其父类

public class MainClass {public static void main(String[] args){//如果使用一个父类,一定适合其子类Person person = new Person();display(person);  //报错Person man = new Man();display(man);  //报错}//修改参数为Manpublic static void display(Man man){man.display();}
}

二、问题分析:企鹅是一种鸟类吗

2.1 Bird
public interface Bird {public void fly();
}
2.2 LaoYing
public class LaoYing implements Bird {public void fly() {System.out.println("老鹰在飞");}
}
2.3 MaQue
public class MaQue implements Bird {public void fly() {System.out.println("麻雀在飞");}
}
2.4 QiE
//企鹅不能飞,但是鸟类,被强制实现了接口,飞的方法就必须实现,这时候就不符合里氏代换原则
//所以企鹅不应该实现该接口
public class QiE {}
2.5 MainClass
public class MainClass {public static void main(String[] args){fly(new LaoYing());fly(new QiE());  //报错,因为企鹅是鸟类,但是不能飞,不应该实现该接口}public static void fly(Bird bird){bird.fly();}
}

三、问题分析:正方形是一种长方形吗

现实生活中认为,正方形是一种特殊的长方形,但该例子中,我们把长方形跟正方形看成两个独立的类,长方形里面有width、height两个属性,正方形里面有side一个属性,所以正方形不是长方形的子类,不存在里氏代换关系。

如果我们让正方形继承长方形,并覆盖长方形的getWidth、getHeight等方法,设置和返回的都是side

3.1 CFX
public class CFX {private long width;private long height;public long getWidth() {return width;}public void setWidth(long width) {this.width = width;}public long getHeight() {return height;}public void setHeight(long height) {this.height = height;}
}
3.2 ZFX
public class ZFX extends CFX {private long side;public long getWidth() {return this.getSide();}public void setWidth(long width) {this.setSide(width);}public long getHeight() {return this.getSide();}@Overridepublic void setHeight(long height) {this.setSide(height);}public long getSide() {return side;}public void setSide(long side) {this.side = side;}
}
3.3 MainClass

在方法test中,打印出高和宽,编译器可以通过,正方形跟长方形都可以使用这个方法,但在resize方法中,对于正方形是死循环,这时候便不符合一定适合子类这个规则

public class MainClass {public static void main(String[] args){//编译器通过,可以使用CFX cfx = new CFX();cfx.setHeight(10);cfx.setWidth(20);test(cfx);resize(cfx);CFX zfx = new ZFX();zfx.setWidth(20);test(zfx);//程序一直执行resize(zfx);}public static void test(CFX cfx){System.out.println("高:"+cfx.getHeight());System.out.println("宽:"+cfx.getWidth());}//当长方形的宽高小于等于高的时候,宽就会递增//对于正方形就是死循坏//这时候便不符合适合子类这个规则public static void resize(CFX cfx){while(cfx.getHeight()<=cfx.getWidth()){cfx.setHeight(cfx.getHeight()+1);test(cfx);}}
}

JAVA设计原则:里氏代换原则相关推荐

  1. 软件设计原则——里氏代换原则

    里氏代换原则 里氏代换原则是面向对象设计的基本原则之一. 里氏代换原则:任何基类可以出现的地方,子类一定可以出现. 通俗理解:子类可以扩展父类的功能,但不能改变父类原有的功能. 换句话说,子类继承父类 ...

  2. 面向对象五大设计原则-里氏代换原则

    1.里氏代换原则 里氏代换原则(Liskov Substitution Principle)是指,任何基类出现的地方,子类一定可以出现.反之则不一定成立. 通俗的讲便是:"老鼠儿子会打洞&q ...

  3. java设计模式之设计原则⑥里氏代换原则

    定义: (1)一个软件实体如果使用的是一个父类的话,那 么一定适用于其子类,而且它察觉不出父类和子 类对象的区别.也就是说,在软件里面,把父类 替换成它的子类,程序的行为没有变化. (2)一个软件实体 ...

  4. java与模式--里氏代换原则,依赖倒置原则

    一里氏代换原则 1.基类可以出现的地方,子类也可以出现. 2.子类可以替换基类出现的替换,软件的功能行为不改变,则基类可以复用,子类可以扩展基类的功能. 3.例子 <1>正方形继承长方形. ...

  5. 设计模式七大原则-里氏代换原则

    文章目录 一.概念 二.例程 三.代码示例 一.概念 里氏代换原则(Liskov Substitution Principle, LSP):所有引用基类(父类)的地方必须能透明地使用其子类的对象 里氏 ...

  6. 设计模式—六大原则—里氏代换原则

    里氏代换原则(Liskow-Substitution-Principle) 定义:子类对象能够替换父类对象,而程序逻辑不变. ​ 里氏替换原则是确保继承正确使用的方法(继承使用的要求条件). ​ Li ...

  7. Java设计原则之单一职责原则、开闭原则、里氏代换原则

    文章目录 面向对象设计原则概述 单一职责原则 开闭原则 里氏代换原则 面向对象设计原则概述 软件的可维护性(Maintainability)和可复用性(Reusability)是两个非常重要的用于衡量 ...

  8. 带你认识六种设计原则(开闭原则、里氏代换原则、依赖倒转原则....)

    前言 1. 设计原则 1.1. 开-闭原则 1.2. 里氏代换原则 1.3. 依赖倒转原则 1.4. 接口隔离原则 1.5. 合成/聚合原则 1.6. 迪米特法则 前言 学习设计模式之前先要了解其中的 ...

  9. 设计原则(3)-里氏代换原则

    本文转自:http://www.cnblogs.com/guoshiandroid/archive/2010/06/14/1758047.html 里氏代换原则 法海捉拿白蛇新解  应用场景举例: & ...

  10. 【设计原则】里氏代换原则

    一.什么是里氏代换原则 里氏代换原则 : 子类可以扩展父类的功能,但是不能改变父类原有的功能.(子类尽量不要重写父类的方法) 原因:重写父类的方法会降低整个继承体系的复用性(当多态频繁时,程序出错概率 ...

最新文章

  1. elcipse 安装lombok插件解决 @Slf4j 等找不到log变量问题
  2. IIS7 设置读取、脚本和可执行文件的执行权限的步骤
  3. koa-static使用时报Unexpected token function
  4. 云炬随笔20190419
  5. Swift傻傻分不清楚系列(四)基本运算符 o_O!???
  6. ntpd、ntpdate、hwclock的区别
  7. ctfshow-WEB-web9( MD5加密漏洞绕过)
  8. 强网杯2021CTF 强网先锋shellcode侧信道攻击复现
  9. 生成对抗网络(GAN)教程 - 多图详解
  10. Studio 3T破解方式
  11. java方法的通用格式,【学习笔记】使用Java读取、写入Excel全版本(包含xls、xslx格式)通用方法及代码展示(POI)...
  12. 如何在电脑上查看手机网页源代码?
  13. matlab画箱型图均值方差,Matlab 绘制箱线图
  14. vue使用echarts图表自适应的几种解决方案
  15. 2-5 修理牧场【优先队列/最小堆】
  16. MATLAB Simulink 仿真
  17. 简报 | 呼吁建立全球性加密货币征税体系和法规 或在2020年最终敲定
  18. lytro 光场相机 重聚焦
  19. 学 Python 必看的书单汇总
  20. 【TWS使用系列2】如何通过TWS下单及查看账户盈亏

热门文章

  1. python列表实现栈,Python之列表实现栈的工作功能
  2. mysql左连接表要取最新的一条数据_MySQL的左连接查询,只取出最大的一条数据...
  3. 碎片化学习,这些网站必不可少!
  4. C++实现行列式的计算
  5. python字体类型arial_Arial Narrow字体是Arial的()
  6. 好看的日剧推荐-看日剧学日语
  7. 用Python解析XMind工具 - xmindparser
  8. 【第77篇】GPT-4技术报告
  9. 【Bug_Solidworks】真正成功解决Solidworks2019无法获得下列许可期望的Soliworks监控程序已关闭问题(-97,121,0)
  10. 手机版明日之后无限法则服务器,《明日之后》安卓版服务器被挤爆,玩家吐槽网易没钱买服务器,对此你怎么看?...