JAVA设计原则:里氏代换原则
里氏代换原则
一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类和子类对象的区别。也就是说,在软件里面,把父类替换成它的子类,程序的行为没有变化。一个软件实体如果使用的是一个子类的话,那
么它不能适用于其父类。
一、里氏代换原则例子
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.里氏代换原则 里氏代换原则(Liskov Substitution Principle)是指,任何基类出现的地方,子类一定可以出现.反之则不一定成立. 通俗的讲便是:"老鼠儿子会打洞&q ...
- java设计模式之设计原则⑥里氏代换原则
定义: (1)一个软件实体如果使用的是一个父类的话,那 么一定适用于其子类,而且它察觉不出父类和子 类对象的区别.也就是说,在软件里面,把父类 替换成它的子类,程序的行为没有变化. (2)一个软件实体 ...
- java与模式--里氏代换原则,依赖倒置原则
一里氏代换原则 1.基类可以出现的地方,子类也可以出现. 2.子类可以替换基类出现的替换,软件的功能行为不改变,则基类可以复用,子类可以扩展基类的功能. 3.例子 <1>正方形继承长方形. ...
- 设计模式七大原则-里氏代换原则
文章目录 一.概念 二.例程 三.代码示例 一.概念 里氏代换原则(Liskov Substitution Principle, LSP):所有引用基类(父类)的地方必须能透明地使用其子类的对象 里氏 ...
- 设计模式—六大原则—里氏代换原则
里氏代换原则(Liskow-Substitution-Principle) 定义:子类对象能够替换父类对象,而程序逻辑不变. 里氏替换原则是确保继承正确使用的方法(继承使用的要求条件). Li ...
- Java设计原则之单一职责原则、开闭原则、里氏代换原则
文章目录 面向对象设计原则概述 单一职责原则 开闭原则 里氏代换原则 面向对象设计原则概述 软件的可维护性(Maintainability)和可复用性(Reusability)是两个非常重要的用于衡量 ...
- 带你认识六种设计原则(开闭原则、里氏代换原则、依赖倒转原则....)
前言 1. 设计原则 1.1. 开-闭原则 1.2. 里氏代换原则 1.3. 依赖倒转原则 1.4. 接口隔离原则 1.5. 合成/聚合原则 1.6. 迪米特法则 前言 学习设计模式之前先要了解其中的 ...
- 设计原则(3)-里氏代换原则
本文转自:http://www.cnblogs.com/guoshiandroid/archive/2010/06/14/1758047.html 里氏代换原则 法海捉拿白蛇新解 应用场景举例: & ...
- 【设计原则】里氏代换原则
一.什么是里氏代换原则 里氏代换原则 : 子类可以扩展父类的功能,但是不能改变父类原有的功能.(子类尽量不要重写父类的方法) 原因:重写父类的方法会降低整个继承体系的复用性(当多态频繁时,程序出错概率 ...
最新文章
- Mac 完全卸载 Java
- 打包静默安装参数(nsis,msi,InstallShield,InnoSetup)[转]
- GTK编程——linux下GTK开发环境建立(ubuntu)
- Java Calendar hashCode()方法与示例
- python创建空字典_Python创建和访问字典
- ORA-00304: requested INSTANCE_NUMBER is busy
- 公路交通安全设施设计细则_转让江苏公路交通工程(公路安全设施分项)二级资质(包安许)...
- studiolibrary安装_DAZ Studio 3D扩展包安装使用教程
- cocos2d-js adblock插件冲突
- 查找文件中的某个单词
- 手游方舟重启维护服务器要多久,方舟生存进化手游日常维护多久
- 捡到的苹果手机怎么解id锁_苹果手机软解和硬解的区别
- netbeans卸载
- EOS代码架构及分析(四)
- Ridge和Lasso回归代码实现--Tensorflow部分
- 获诱人的实习offer、在Kaggle推AI大赛,大二学生如何做到?
- 系统服务器选型依据,1.2 服务器选型原则
- DIY自己的超级PE
- 小游戏怎么提升app的用户留存
- 这些Web API真的有用吗? 别问,问就是有用