文章目录

  • 一、概念
  • 二、例程
  • 三、代码示例

一、概念

里氏代换原则(Liskov Substitution Principle, LSP):所有引用基类(父类)的地方必须能透明地使用其子类的对象

里氏代换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。例如:我喜欢动物,那我一定喜欢狗,因为狗是动物的子类;但是我喜欢狗,不能据此断定我喜欢动物,因为我并不喜欢老鼠,虽然它也是动物

实现方法
里氏替换原则通俗来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说:子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法(除非基类中的纯虚函数必须要重写,虚函数可以重写,普通函数不能或者尽量不要重写)

  • 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法

  • 子类中可以增加自己特有的方法

  • 当子类的方法重载父类的方法时,方法的前置条件(即方法的输入参数)要比父类的方法更宽松

  • 当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(即方法的的输出/返回值)要比父类的方法更严格或相等

我们在运用里氏代换原则时,尽量把父类设计为抽象类或者接口,让子类继承父类或实现父接口,并实现在父类中声明的方法,运行时,子类实例替换父类实例,我们可以很方便地扩展系统的功能,同时无须修改原有子类的代码,增加新的功能可以通过增加一个新的子类来实现。里氏代换原则是开闭原则的具体实现手段之一

二、例程

在对系统进行进一步分析后发现,无论是普通客户还是VIP客户,发送邮件的过程都是相同的,也就是说两个send()方法中的代码重复,而且在本系统中还将增加新类型的客户。为了让系统具有更好的扩展性,同时减少代码重复,使用里氏代换原则对其进行重构。

在本实例中,可以考虑增加一个新的抽象客户类Customer,而将CommonCustomer和VIPCustomer类作为其子类,邮件发送类EmailSender类针对抽象客户类Customer编程,根据里氏代换原则,能够接受基类对象的地方必然能够接受子类对象,因此将EmailSender中的send()方法的参数类型改为Customer,如果需要增加新类型的客户,只需将其作为Customer类的子类即可。重构后的结构如图2所示:

三、代码示例

正确的做法是:取消几维鸟原来的继承关系,定义鸟和几维鸟的更一般的父类,如动物类,它们都有呼吸的能力,鸟类继承自动物类,燕子继承自鸟类;几维鸟继承自动物类。

#include <iostream>class Animal{public:float runSpeed;virtual void setRunSpeed(float v) {runSpeed = v;}virtual float getRunTime(float dis) {return dis/runSpeed;}
};class Bird : public Animal{public:float flySpeed;virtual void setSpeed(float v) {flySpeed = v;}virtual float getFlyTime(float dis) {return dis/flySpeed;}
};class Swallow : public Bird {};class BrownKiwi : public Animal {};int main(){Bird* b1 = new Swallow; // &b1 是Animal* b2 = new BrownKiwi;b1->setSpeed(300);b1->setRunSpeed(0.01);b2->setRunSpeed(0.2);std::cout<<"b1 fly time is: " << b1->getFlyTime(300)<<std::endl;std::cout<<"b1 run time is: " << b1->getRunTime(300)<<std::endl;std::cout<<"b2 fly time is: " << b2->getRunTime(300)<<std::endl;return 1;
}

————————————————
版权声明:本文为CSDN博主「龙俊杰的读书笔记」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011852872/article/details/126048726

————————————————
版权声明:本文为CSDN博主「LoveLion」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lovelion/article/details/7540445

设计模式七大原则-里氏代换原则相关推荐

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

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

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

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

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

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

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

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

  5. 大话设计模式三之单一职责原则、开放-封闭原则、依赖倒置原则、里氏代换原则

    单一职责原则 单一职责原则(SRP),意思就是说,功能要单一.准确解释是,就一个类而言,应该仅有一个引起它变化的原因. 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或 ...

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

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

  7. Java设计模式之二十八(里氏代换原则)

    一.什么是里氏代换原则 里氏代换原则(Liskov Substitution Principle):一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类和子类对象的区别.也就 ...

  8. 设计模式-设计原则之里氏代换原则

    设计原则之里氏代换原则 里氏代换原则 案例(正方形不是长方形) 案例改进 里氏代换原则 里氏代换原则是面向对象设计的基本原则之一. 里氏代换原则:任何基类可以出现的地方,子类一定可以出现. 通俗理解: ...

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

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

最新文章

  1. cpp cu入门教程
  2. python顺序表代码_python实现顺序表的简单代码
  3. JS中简单数据类型和复杂数据类型
  4. [zz]为小米创建虚拟机路由器
  5. 深度装机大师一键重装_做好电脑重装系统前后的这些注意事项,让你从此摆脱装机忧愁!...
  6. 利用EXCEL对数据进行比对,以及提取有效数据
  7. nbu里oracle备份al开头的,认识NBU备份Oracle时Code 29错误
  8. IDEA的Mybatis插件
  9. python open file失败_python open打开文件失败原因及解决办法
  10. 基于matlab的排队系统仿真
  11. USB3.0:VL817Q7-C0的LAYOUT指南(三)
  12. 【Linux】【操作】Linux操作集锦系列之一——定时任务
  13. 一文总结买卖股票的最佳时机的所有情况(附Python代码)
  14. windows如何截屏
  15. python两列时间间隔计算器_计算两列之间的Pandas DataFrame时间差异(以小时和分钟为单位)...
  16. 基于单片机的贪吃蛇设计
  17. oracle 创建唯一索引
  18. 什么是大数据4v 指的是哪四个
  19. SSM3---SpringMVC
  20. Adobe_Premiere_Pro_2023_23.2.0.69最新版介绍及图文安装教程

热门文章

  1. linux vtune 生成文字报告,文字报告太枯燥,教你一招,只需十分钟,一屏可视化!...
  2. Java的引用类型之数组
  3. div鼠标放上去会变成小手样式
  4. 荣耀10xmax可以升级鸿蒙吗,荣耀x10和荣耀x10max区别 哪些人值得买?
  5. ftp连接成功, 读取目录列表失败, 是什么原因?
  6. SDRAM - 一个简单的存储控制器
  7. 华为nova3是鸿蒙,今天发布!华为nova 3亮点汇总:不止是颜值党
  8. Sketch的文件不用MAC电脑也能打开了
  9. Memcached 工作原理介绍
  10. jumpserver通过局域访问内网服务器