里氏代换原则

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

一、里氏代换原则例子

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. Mac 完全卸载 Java
  2. 打包静默安装参数(nsis,msi,InstallShield,InnoSetup)[转]
  3. GTK编程——linux下GTK开发环境建立(ubuntu)
  4. Java Calendar hashCode()方法与示例
  5. python创建空字典_Python创建和访问字典
  6. ORA-00304: requested INSTANCE_NUMBER is busy
  7. 公路交通安全设施设计细则_转让江苏公路交通工程(公路安全设施分项)二级资质(包安许)...
  8. studiolibrary安装_DAZ Studio 3D扩展包安装使用教程
  9. cocos2d-js adblock插件冲突
  10. 查找文件中的某个单词
  11. 手游方舟重启维护服务器要多久,方舟生存进化手游日常维护多久
  12. 捡到的苹果手机怎么解id锁_苹果手机软解和硬解的区别
  13. netbeans卸载
  14. EOS代码架构及分析(四)
  15. Ridge和Lasso回归代码实现--Tensorflow部分
  16. 获诱人的实习offer、在Kaggle推AI大赛,大二学生如何做到?
  17. 系统服务器选型依据,1.2 服务器选型原则
  18. DIY自己的超级PE
  19. 小游戏怎么提升app的用户留存
  20. 这些Web API真的有用吗? 别问,问就是有用

热门文章

  1. 闲鱼大闹618,狙击京东?颠覆淘宝?凭什么以小博大?
  2. 小程序+spring boot心理测评与活动管理系统毕业设计-附源码191752
  3. Linux 命令(9)—— tcpdump 命令
  4. 模数转换(A/D)和数模转换(D/A) 图示
  5. 绘制可伸缩矢量图形(SVG)
  6. 国产蓝牙耳机什么牌子的好?音质好的国产耳机品牌
  7. 支持C4D的GPU云渲染平台有哪些?
  8. Java构建cron表达式
  9. NSAttributedString设置字体属性
  10. 怎么让上下两排对齐_Word中上下两行对不齐的处理方法