转载自:https://mp.weixin.qq.com/s/Uq4g53cQ7YKAXP8TuRV2Gw

定义:

1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。

2:所有引用基类的地方必须能透明地使用其子类的对象

通俗来讲:父类必须能够使用子类替换

里氏替换原则能带来哪些好处?

  1. 里氏替换原则能够将对于基类中定义的所有子程序,用在它的任何一个派生类中时的含义都应该是相同的。这样继承才不会增加复杂度,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。继承带来的复杂度就降低了。

  2. 针对基类编程可以提高代码的复用性

如何保证遵循里氏替换原则

继承是保证里氏替换原则的前提,但是继承也有不能满足里氏替换原则的时候。此时我们可以采用如下两种方法进行设计:

1、重新提取公共部分的方法

把冲突的派生类与基类的共部分提取出来作为一个抽象基类,然后分别继承这个类。

2、改变继承关系

即:从父子关系变为委派关系或兄弟关系。

可以把它们的一些公有特性提取到一个抽象接口,再分别实现。

例如:

最初发送邮件的设计如下:

考虑到给普通人发送邮件和给VIP用户发送邮件中的send方法中的代码有重复,遵从里氏替换原则,我们将共有部分的代码提取出来,并改变CommonCustomer和VIPCustomer的继承关系。修改之后如下:

总结:

里氏替换原则通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。

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

  2. 子类中可以增加自己特有的方法。

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

  4. 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

 

转载于:https://www.cnblogs.com/xingzc/p/9066867.html

设计模式原则之里氏替换原则相关推荐

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

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

  2. python里氏替换原则_设计模式六大原则之里氏替换原则

    这是设计模式6 大原则系列的第二篇文章,附上前一篇文章地址:设计模式六大原则之单一职责原则.本文主要讲解设计模式的里氏替换原则. 肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑.其 ...

  3. 软件设计原则之里氏替换原则、依赖倒置原则

    系列文章目录 软件设计原则之单一职责原则.开闭原则 软件设计原则之里氏替换原则.依赖倒置原则 软件设计原则之接口隔离原则.合成复用原则.迪米特原则 文章目录 系列文章目录 一.里氏替换原则 什么是里氏 ...

  4. 七大设计原则之里氏替换原则应用

    目录 1 里氏替换原则 2 里氏替换原则应用 1 里氏替换原则 里氏替换原则(Liskov Substitution Principle,LSP)是指如果对每一个类型为 T1 的对象 o1,都有类型为 ...

  5. 6大设计原则之里氏替换原则

    面对对象中的继承 优点如下: 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性 提高代码的重用性 子类可以形如父类,但又异于父类 提高代码的可扩展性,很多开源框架的扩展接口都是通过继承父类 ...

  6. 开闭原则与里氏替换原则

    1.开闭原则 是面向对象设计的基本原则之一,是"可复用设计"的基础,它的主要原则是:对扩展开放,对修改关闭:意思就是我们改变一个软件时.应该通过扩展方式来改变软件,而不是修改原有的 ...

  7. 深入理解开闭原则、里氏替换原则

    开闭原则(Open-Closed Principle)里氏替换原则 开闭原则(Open-Closed Principle) What 什么是开闭原则? Why 为什么要使用开闭原则和When 什么时候 ...

  8. 设计模式六大原则之里氏替换原则、依赖倒置原则详解

    设计模式六大原则--里氏替换原则.依赖倒置原则详解 1.里氏代换原则(Liskov Substitution Principle) 概念 顾名思义,该原则用于经常发生替换的地方,在Java中指的是实现 ...

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

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

最新文章

  1. redis消息队列写入mysql_redis怎么实现将消息队列持久化到数据库中?
  2. mysql所有班级名称和人数_mysql数据库优化课程---12、mysql嵌套和链接查询(查询user表中存在的所有班级的信息?)...
  3. 微信小程序发送模板消息,php发送模板消息
  4. 我的青春谁做主的经典语录
  5. [转]带花树,Edmonds's matching algorithm,一般图最大匹配
  6. python-list列表排序问题 sort 与 sorted
  7. NPER用计算机怎么算,计算机财务管理第三章详解.doc
  8. python 函数特殊属性
  9. Struts2→MCV、环境搭建第一个样例、工作原理、核心文件、XML中常用元素、通配符、action后缀、action接收参数、result、标签
  10. Python-Matplotlib可视化(番外篇)——Matplotlib中的事件处理详解与实战
  11. HDU 2639 Bone Collector II (dp)
  12. “公益AI之星”挑战赛-新冠疫情相似句对判定大赛
  13. 关于信息熵的简单理解
  14. 【VRP】基于matlab模拟退火算法求解单中心的车辆路径规划问题【含Matlab源码 1340期】
  15. 【图像隐写】基于matlab LDPC编码译码改进DCT水印嵌入提取【含Matlab源码 832期】
  16. 【设计过程】.NET ORM FreeSql WhereDynamicFilter 动态表格查询功能
  17. 在eclipse上安装lomboz插件
  18. 【FPGA】精品FPGA书籍推荐
  19. VirtualBox Linux网络配置
  20. 分数加减法(C语言)

热门文章

  1. java 多态实现的jvm调用过程_多态:JVM是如何进行方法调用的
  2. java参数传入泛型类型_Java泛型参数界定到任何一个类型的范围
  3. 方正高影仪安装方法_铝合金门窗是怎么安装的?
  4. php asserttrue,PHP8.0的新特性:错误处理方面已经改进
  5. python列表常用の操作
  6. c++ 不能分配给为0的数组_【嵌入式C】你有想过quot;数组下标quot;为何从0开始吗?...
  7. java对象怎么创建_java对象是怎么创建出来的
  8. 重建索引一般需要多久_游泳小白学游泳,一般需要多久才能学会?猜猜看
  9. 计算机主机的主要包括,微型计算机的主机主要包括
  10. c语言中case1 case3 n =1,(n 1)-Step Derivations on n-Groupoids: The Case n = 3