一、什么是里氏代换原则

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

二、反过来的代换不成立

  里氏代换原则(Liskov Substitution Principle): 一个软件实体如果使用的是一个子类的话,那 么它不能适用于其父类。

三、企鹅是鸟类吗??

四、正方形是一种长方形吗??

正方形不是长方形的子类,因此之间不存在里氏代换关系。

五、好骗的Java编译器

六、原来还有一个四边形的概念?

能够骗过Java编译器,真的符合里氏代换原则吗?答案是否定的

 public class Person {
public void display() {
System.out.println("this is person");
}
}

男人

 public class Man extends Person {

     public void display() {
System.out.println("this is man");
}
}

测试

 public class MainClass {
public static void main(String[] args) {
Person person = new Person();
// display(person); Man man = new Man();
display(man);
} public static void display(Man man) {
man.display();
}
}

=================================================================

ex2:

鸟  接口

 //鸟
public interface Bird {
public void fly();
}

老鹰

 //老鹰
public class Laoying implements Bird { public void fly() {
System.out.println("老鹰在飞");
}
}

麻雀

 //麻雀
public class Maque implements Bird { public void fly() {
System.out.println("麻雀在飞");
}
}

测试

 public class MainClass {
public static void main(String[] args) {
fly(new Laoying());
} public static void fly(Bird bird) {
bird.fly();
}
}

=============================================================

ex3:

四边形  接口

 //四边形
public interface Sibianxing {
public long getWidth();
public long getHeight();
}

长方形

 //长方形
public class ChangFX implements Sibianxing{
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;
}
}

正方形

 //正方形
public class ZhengFX implements Sibianxing{
private long side; public long getHeight() {
return this.getSide();
} public long getWidth() {
return this.getSide();
} public void setHeight(long height) {
this.setSide(height);
} public void setWidth(long width) {
this.setSide(width);
} public long getSide() {
return side;
} public void setSide(long side) {
this.side = side;
}
}

测试

 public class MainClass {
public static void main(String[] args) {
ChangFX changfx = new ChangFX();
changfx.setHeight(10);
changfx.setWidth(20);
test(changfx); ZhengFX zhengfx = new ZhengFX();
zhengfx.setHeight(10);
test(zhengfx);
} public static void test(Sibianxing sibianxing) {
System.out.println(sibianxing.getHeight());
System.out.println(sibianxing.getWidth());
} // public static void resize(Sibianxing sibianxing) {
// while(sibianxing.getHeight() <= sibianxing.getWidth()) {
// sibianxing.setHeight(sibianxing.getHeight() + 1);
// test(sibianxing);
// }
// }
}

3里氏代换原则LSP的更多相关文章

  1. 设计模式之里氏代换原则(LSP)

    里氏代换原则(Liskov Substitution Principle, LSP) 1 什么是里氏代换原则 里氏代换原则是由麻省理工学院(MIT)计算机科学实验室的Liskov女士,在1987年的O ...

  2. 里氏代换原则(Liskov Substitution Principle,LSP)

    第一种定义: 如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换为o2,程序P的行为没有发生变化,那么类型S是类型T的子类型. 第二种定义: 所有引 ...

  3. 《设计模式》-原则二:里氏代换原则(LSP)

    回顾一下上一节说的“开闭原则” 说的是 一个软件要遵循对修改关闭 对新功能扩展的原则. 这一次来说说 “里氏代换原则” 意思是说:子类型必须能代替他们的基类. 看了半天的例子 好像 是懂非懂啊...相 ...

  4. .net学习之继承、里氏替换原则LSP、虚方法、多态、抽象类、Equals方法、接口、装箱拆箱、字符串

    1.继承(1)创建子类对象的时候,在子类对象中会为子类对象的字段开辟空间,也会为父类的所有字段开辟空间,只不过父类私有的成员访问不到(2)子类从父类继承父类所有的非私有成员,但是父类的所有字段也会创建 ...

  5. 架构师之路——里氏替换原则LSP

    定义: 如果对每一个对类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型. 内容: 里氏替换原则通 ...

  6. 设计模式原则——依赖倒转&里氏代换原则

    设计模式一共有六大原则: 单一原则.开放封闭原则.接口分离原则.里氏替换原则.最少知识原则.依赖倒置原则. 这篇博客是自己对依赖倒转&里氏代换原则的一些拙见,有何不对欢迎大家指出. 依赖倒转原 ...

  7. 深入理解JavaScript系列(8):S.O.L.I.D五大原则之里氏替换原则LSP

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第3篇,里氏替换原则LSP(The Liskov Substitution Principle ). 英文原文:http ...

  8. 里氏替换原则(LSP)

    替换原则由MIT计算机科学实验室的Liskov女士在1987年的OOPSLA大会上的一篇文章中提出,主要阐述有关继承的一些原则,故称里氏替换原则. 2002年,Robert C.Martin出版了一本 ...

  9. &quot;围观&quot;设计模式(2)--里氏替换原则(LSP,Liskov Substitution Principle)

    在面向对象的程序设计中.里氏替换原则(Liskov Substitution principle)是对子类型的特别定义.它由芭芭拉·利斯科夫(Barbara Liskov)在1987年在一次会议上名为 ...

随机推荐

  1. python之封装与扩展性

    1.封装与扩展性 封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用的代码:而外部使用者只知道一个接口(函数),只要接口(函数)名,参数不变,使用者的代码永远无需改变.这就提供了一 ...

  2. 【倍增】Tak and Hotels II @ABC044&ARC060/upcexam6463

    6463: Tak and Hotels II 时间限制: 1 Sec  内存限制: 128 MB 题目描述 N hotels are located on a straight line. The ...

  3. JS膏集03

    JS膏集03 1.复习 原型: * 在构造函数中有一个属性:prototype,是原型,也是一个对象,程序员使用的 * 在实例对象中有一个属性:__proto__,是原型,也是一个对象,浏览器使用的, ...

  4. Your project is not referencing the ".NETPortable,Version=v4.5,Profile=Profile259" framework. Add a reference to ".NETPortable,Version=v4.5,Profile=Profile259" in the "frameworks" section of your proj

    i want to add nuget packages to my portable class library project , then i add a project.json to my ...

  5. [web 前端] mobx教程(一)-mobx简介

    opy from : https://blog.csdn.net/smk108/article/details/84777649 Mobx是通过函数响应式编程使状态管理变得简单和可扩展的状态管理库.M ...

  6. ZABBIX 4.0 LTS 部署

    1. 环境说明 关于zabbix的详细使用可以参考之前的3.0 版本,该文档仅记录zabbix 4.0 编译安装过程!ZABBIX 3.0 从入门到精通(zabbix使用详解) : https://w ...

  7. CentOS7.2网络配置

    修改hostname vi /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain ...

  8. AttributeError: 'dict' object has no attribute 'has_key'

    运行下面的代码: if (locals().has_key('data')): del data gc.collect() 出错: if (locals().has_key('data')): Att ...

  9. IIS 重写 HTTP 重定向到 HTTPS

    1.购买SSL证书 2.IIS7 / IIS 7.5 下绑定 HTTPS 网站(购买Wildcard SSL泛域名证书可绑定多个子域名)参考上文 3.下载安装URL重写模块:Microsoft URL ...

  10. Ant之build.xml配置详解【转】

    原文:https://blog.csdn.net/mevicky/article/details/72828554 前言国内关于build.xml的配置资料太零散了,实在是受不了,故而将自己的笔记整理 ...