作用

它指导我们如何正确地进行继承与派生,并合理地重用代码!

定义

子类型必须能够替换掉它们的父类型、并出现在父类能够出现的任何地方。

这个就是尽量用多态的方法编程,也就是GRASP模式中的多态。

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

换言之,一个软件实体如果使用的是一个基类的话,那么一定适用于其子类,而且它根本不能察觉出基类对象和子类对象的区别。

反过来代换不成立。

里氏替换原则要点:

1)  对于LSP的违反也潜在的违反了OCP

2)  正方形从长方形继承的例子微妙的违反了这种原则

3)  在考虑一个特定的设计是否恰当时,不能孤立地来看这个解决方案,必须根据设计的使用者所做出的合理假设来审视它

4)  对象的行为方式是软件真正所关注的问题,IS A 关系是就行为而言的

5)  派生类只能使用相等或更弱的前置条件来替换原始的前置条件,只能使用相等或更强的前置条件来替换原始的后置条件。

6)  完成的功能少于基类的派生类通常不能替换基类,也不符合LSP

7)  派生类不应该抛出基类不能预计的异常,否则违反LSP

里氏代换原则分析

里氏代换原则可以通俗表述为:在软件中如果能够使用基类对象,那么一定能够使用其子类对象。把基类都替换成它的子类,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类的话,那么它不一定能够使用基类。

里氏代换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。

里氏代换原则(Liskov Substitution Principle)相关推荐

  1. 软件设计原则(三)里氏替换原则 -Liskov Substitution Principle

    里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一. 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现. LSP是继承复用的基石,只 ...

  2. Java设计模式之里氏替换原则(Liskov Substitution principle)

    2019独角兽企业重金招聘Python工程师标准>>> Java是面向对象的语言,那么什么是面向对象程序设计呢? 面向对象程序设计(英语:Object-oriented progra ...

  3. ABAP设计模式之---“里氏替换原则(Liskov Substitution Principle)”

    1. 定义 子类型必须能够替换掉他们的父类型. 2. 解读 子类可以扩展父类的功能,但不能改变父类原有的功能.也即: a) 子类可以实现父类的抽象方法,但不能覆盖/重写父类的的非抽象方法 b) 子类可 ...

  4. 里氏代换原则C#详解

    看了一大堆的资料讲解关于里氏代换原则,在这里我想分享给大家. 下面这段话来自百度百科,是这么解释里氏代换原则的: 里氏代换原则(Liskov Substitution Principle LSP)是面 ...

  5. 系统设计原则之里氏代换原则

    之前讲述的"开-闭"原则是系统设计的主原则,做到这点是一件很不容易的工作.但是也不是高不可攀的,除此原则以外还有其他的一些设计原则为实现或者说尽可能的达到"开-闭&quo ...

  6. 里氏代换原则——与多态的辩证关系

    ☀里氏代换原则 1.概念:(注意黄色划线部分) 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一. 里氏代换原则中说,任何基类可以出现的地方 ...

  7. 什么是 里氏代换原则?

    里氏代换原则 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一. 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现. LSP是继承 ...

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

    文章目录 一.概念 二.例程 三.代码示例 一.概念 里氏代换原则(Liskov Substitution Principle, LSP):所有引用基类(父类)的地方必须能透明地使用其子类的对象 里氏 ...

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

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

  10. 里氏代换原则 举例 分析

    里氏代换原则 定义:里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一. 目的:里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现.L ...

最新文章

  1. HarmonyOS UI 开发 vp ,fp , px 以及写具体数字的 理解
  2. devops和docker_通过免费的2小时Docker课程学习DevOps基础知识
  3. 2021年春季学期-信号与系统-第七次作业参考答案-第一小题
  4. spring-cloud:熔断监控Hystrix Dashboard和Turbine的示例
  5. python怎么编写视觉识别_Python视觉识别--OpenCV色彩空间\图像运算\ROI(四)
  6. node遍历给定目录下特定文件,内容合并到一个文件
  7. [mybatis]缓存_缓存有关的设置以及属性
  8. Java System类exit()方法及示例
  9. 只用一套解决方案,就可解决80%的交通物流行业信息难题
  10. 【Java从入门到头秃专栏 6】语法篇(五) :多线程 线程池 可见、原子性 并发包 Lambda表达式
  11. 草莓软件验证系统源码 附带易语言模块
  12. CentOS项目实例之一--操作系统安装
  13. *** ERROR L107: ADDRESS SPACE OVERFLOW
  14. 音乐彩灯控制器C语言程序,基于单片机的LED彩灯控制器
  15. Android Launcher研究与开发——桌面的初步定制化
  16. js中的Image对象
  17. 天龙八部手游服务器维护公告,天龙八部手游 近期更新维护公告
  18. k8s-存储-Secret
  19. 用python证明采样定理_如何理解 Nyquist 采样定理?
  20. 模拟赛20200228(yyq)【右链+dfs序,子树管辖,聚集水流问题】

热门文章

  1. 自定义域名:为自己的CSDN博客添加自定义域名吧!
  2. 正则表达式 匹配任意长度的字符
  3. 用python每日更换“必应图片”为“桌面壁纸”
  4. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx分解线xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  5. Python 相关文件常见的后缀名详解
  6. 力学专业做cae需要学c语言吗,CAE工程师是需要掌握力学知识到何种程度_
  7. 如何建设IDC数据中心机房?需要办理哪些许可证和资质【技术篇】华信网通帮您解答!
  8. 使用 SysRq 查看系统信息
  9. Nginx的负载均衡 - 最少连接 (least_conn)
  10. 1]解决java.util.concurrent.RejectedExecutionException