转载请标明:http://blog.csdn.net/liulongling/article/details/51383159
面向对象其它六大原则
单一职责原则-带你走梦幻西游(一)
依赖倒置原则(二)
开闭原则(三)
迪米特原则-带你走进梦幻西游(四)
接口隔离原则(六)

里氏代换原则是由麻省理工学院(MIT)计算机科学实验室的Liskov女士,在1987年的OOPSLA大会上发表的一篇文章《Data Abstraction and Hierarchy》里面提出来的,主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中的蕴涵的原理。2002年,我们前面单一职责原则中提到的软件工程大师Robert C. Martin,出版了一本《Agile Software Development Principles Patterns and Practices》,在文中他把里氏代换原则最终简化为一句话:“Subtypes must be substitutable for their base types”。也就是,子类必须能够替换成它们的基类。
我们把里氏代换原则解释得更完整一些:在一个软件系统中,子类应该可以替换任何基类能够出现的地方,并且经过替换以后,代码还能正常工作。

定义一:
如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。
定义二:
所有引用基类的地方必须能透明地使用其子类的对象。

//
//  里氏替换原则.cpp
//  c++
//
//  Created by 刘龙玲 on 16/5/12.
//  Copyright © 2016年 liulongling. All rights reserved.
//#include <iostream>
using namespace std;//案例:鸵鸟非鸟
class Bird
{
public:bool fly() {//鸟类可以飞;return true;};int getVelocity(){return this->velocity;}
private:int velocity;
};//鸵鸟
class Ostrich: public Bird
{bool fly() {//鸵鸟不可以飞;return false;};int getVelocity(){return 0;}
};int main()
{//计算鸟飞越黄河所需的时间。Bird* bird = new Ostrich;cout<<"h:"<<3000/bird->getVelocity()<<endl;return 0;
}

由于C++标准没有把除0错当成标准异常,和原生数组访问越界为什么不是一异常一样,主要还是为了“效率/性能”。C++之父在谈C++语言设计的书(The Design and Evolution of C++)里谈到:

“low-level events, such as arithmetic overflows and divide by zero, are assumed to be handled by a dedicated lower-level mechanism rather than by exceptions. This enables C++ to match the behaviour of other languages when it comes to arithmetic. It also avoids the problems that occur on heavily pipelined architectures where events such as divide by zero are asynchronous.”

简单翻译一下: “底层的事件,比如计算上的溢出和除0错,被认为应用有一个同样底层的机制去处理它们,而不是异常。这让C++在涉及到算术领域的性能,可以和其它语言竞争。再者,它也避免了当某些事件,比如除0错是异步的情况下(译者注:比如在别一个线程里发生)所可能造成的‘管道重重’的架构这一问题。”所以我换成用java代码实现这个案例

package com.lll.test;
//鸟
public class Bird {private int velocity;public int getVelocity() {return velocity;}public void setVelocity(int velocity) {this.velocity = velocity;}
}
package com.lll.test;
//鸵鸟
public class Ostrich extends Bird{public int getVelocity() {return 0;}
}
package com.lll.test;public class main {public static void main(String[] args) {Bird bird = new Bird();bird.setVelocity(100);int h = flyTime(bird);System.out.println("飞行时间是:"+h);}public static int flyTime(Bird bird){return 3000/bird.getVelocity();}
}

运行结果正确:
飞行时间是:30

package com.lll.test;public class main {public static void main(String[] args) {Bird bird = new  Ostrich();bird.setVelocity(100);int h = flyTime(bird);System.out.println("飞行时间是:"+h);}public static int flyTime(Bird bird){return 3000/bird.getVelocity();}
}

运行结果异常:
Exception in thread “main” java.lang.ArithmeticException: / by zero
at com.lll.test.main.flyTime(main.java:11)
at com.lll.test.main.main(main.java:7)

我们知道,面向对象的语言的三大特点是继承,封装,多态,里氏替换原则是依赖于继承,多态这两大特性。里氏替换原则的定义是,所有引用基类的地方必须能透明地使用其子类的对象。通俗来讲是只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误和异常。而我们在使用flyTime方法时 ,当使用者flyTime方法里的参数Bird被Ostrich替换掉后,结果出现了异常,那么它明显违背了里氏替换原则。

设计模式六大原则:里氏替换原则(五)相关推荐

  1. 设计模式原则—里氏替换原则

    设计模式概念与作用: 设计模式是一套被反复使用的.多数人知晓.经过分类编目的优秀代码设计经验的总结.特定环境下特定问题的处理方法. 1)重用设计和代码 重用设计比重用代码更有意义,自动带来代码重用 2 ...

  2. 里氏替换原则——举例说明Java设计模式中的里氏替换原则

    里氏替换原则--举例说明Java设计模式中的里氏替换原则 1. 前言 官方定义: 2. 举例说明 2.1 例子介绍 2.2 反例 2.2.1 类图说明 2.2.2 代码说明 2.2.3 测试 2.2. ...

  3. java设计模式3,里氏替换原则

    目录 一.里氏替换原则定义 二.里氏替换原则的作用 三.违背原则场景 四.里氏替换原则改变代码 1.抽象人物类 2.哪吒子类 3.敖丙子类 五.关注公众号哪吒编程,回复1024,获取Java学习资料, ...

  4. 【设计模式】软件设计七大原则 ( 里氏替换原则 | 定义 | 定义扩展 | 引申 | 意义 | 优点 )

    文章目录 一.里氏替换原则定义 二.里氏替换原则定义扩展 三.里氏替换原则引申意义 四.里氏替换原则意义 五.里氏替换原则优点 一.里氏替换原则定义 里氏替换原则定义 : 如果 对每一个 类型为 T1 ...

  5. 可能是最好的设计模式入门教程——里氏替换原则

    里氏替换原则(Liskov Substitution Principle,LSP)是面向对象设计(OOD)中比较重要.常见的一种,下面来总结里氏替换原则的知识点,包括: 维基百科定义 在面向对象的程序 ...

  6. 设计模式|LSP(里氏替换)原则

    软件质量保障 专注测试圈,自动化测试.测试平台开发.测试新技术.大厂测试岗面经分享, 可以帮忙内推BATJ等大厂!欢迎加VX沟通交流: ISTE1024 在面向对象的语言中,继承是非常优秀的语言机制, ...

  7. 设计模式之七大原则——里氏替换原则(LSP)(三)

    里氏替换原则(Liskov Substitution Principel)是解决继承带来的问题. 4 里氏代换原则(Liskov Substitution Principle, LSP) 4.1 什么 ...

  8. java里氏替换原则例子_java设计模式学习笔记——里氏替换原则

    oo中的继承性的思考和说明 1.继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然它不强制要求所有的子类必须遵循这些七月,但是如果子类对这些已经实现的方法任意修改,就会对 ...

  9. 软件设计的七大原则 --开闭原则 里氏替换原则 依赖倒置原则

    在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率.节约软件开发成本和维护成本. 这 7 种设计原则是软件设计 ...

最新文章

  1. 使用leangoo做多团队敏捷开发项目管理
  2. c++ 按键暂停继续 程序_CNC操作面板讲解,看看这些按键是什么意思
  3. [流媒体]实例解析MMS流媒体协议,下载LiveMediaVideo[4]
  4. python手机版下载3.7.3-Python 3.7.0 来了!
  5. unity3d-知识汇总
  6. java string封装类_java中八种基本数据类型以及它们的封装类,String类型的一些理解...
  7. mysql安装时1045错误_MySql 安装时的1045错误
  8. 自然语言处理--基于规则(AIML)的问答机器人
  9. 运行Puttygen.exe生成密钥
  10. socket里sendto()函数
  11. FLV方式实现网页FFmpeg推流无插件播放
  12. 最先进的Git分布式仓库系统——是如何提升编程效率的?
  13. PAT-B 1036. 跟奥巴马一起编程(15)(15 分) 画方型字符
  14. XBL用于防治botnet
  15. 华为 dis ip routing-table怎么看?
  16. 国际会计准则IAS 和 IFRS
  17. 激光雷达(LDS)技术原理解释及实现过程
  18. matlab的多变量dmc源程序,基于MATLAB多变量DMC算法仿真技术研究
  19. 全球最好的大学各专业排名
  20. 如何检查下载的软件是否带有后门

热门文章

  1. 防水运动蓝牙耳机,好用的运动蓝牙耳机
  2. 奇瑞搭载了鸿蒙车载系统,Ai芯天下丨华为鸿蒙进军汽车界,车载系统曝光,自主品牌巨头首发...
  3. 成为智能POS机新擂主,拉卡拉为何依旧惴惴不安?
  4. Minified React error #185;
  5. C#进行Visio二次开发之图纸打印
  6. 【参赛作品32】openGauss2.1.0新特性-账本数据库
  7. 状态栏不显示图标解决方案集锦
  8. 如何用计算机辅助设计进行设计,计算机辅助设计的功能与分析
  9. HBuilderX编辑器F11退出全屏无效的解决办法 - 切换免打扰模式
  10. 数美科技未成年人保护解决方案重磅上线,开启未成年人网络护航新时代