里氏代换原则(Liskov Substitution Principle)
作用
它指导我们如何正确地进行继承与派生,并合理地重用代码!
定义
子类型必须能够替换掉它们的父类型、并出现在父类能够出现的任何地方。
这个就是尽量用多态的方法编程,也就是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)相关推荐
- 软件设计原则(三)里氏替换原则 -Liskov Substitution Principle
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一. 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现. LSP是继承复用的基石,只 ...
- Java设计模式之里氏替换原则(Liskov Substitution principle)
2019独角兽企业重金招聘Python工程师标准>>> Java是面向对象的语言,那么什么是面向对象程序设计呢? 面向对象程序设计(英语:Object-oriented progra ...
- ABAP设计模式之---“里氏替换原则(Liskov Substitution Principle)”
1. 定义 子类型必须能够替换掉他们的父类型. 2. 解读 子类可以扩展父类的功能,但不能改变父类原有的功能.也即: a) 子类可以实现父类的抽象方法,但不能覆盖/重写父类的的非抽象方法 b) 子类可 ...
- 里氏代换原则C#详解
看了一大堆的资料讲解关于里氏代换原则,在这里我想分享给大家. 下面这段话来自百度百科,是这么解释里氏代换原则的: 里氏代换原则(Liskov Substitution Principle LSP)是面 ...
- 系统设计原则之里氏代换原则
之前讲述的"开-闭"原则是系统设计的主原则,做到这点是一件很不容易的工作.但是也不是高不可攀的,除此原则以外还有其他的一些设计原则为实现或者说尽可能的达到"开-闭&quo ...
- 里氏代换原则——与多态的辩证关系
☀里氏代换原则 1.概念:(注意黄色划线部分) 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一. 里氏代换原则中说,任何基类可以出现的地方 ...
- 什么是 里氏代换原则?
里氏代换原则 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一. 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现. LSP是继承 ...
- 设计模式七大原则-里氏代换原则
文章目录 一.概念 二.例程 三.代码示例 一.概念 里氏代换原则(Liskov Substitution Principle, LSP):所有引用基类(父类)的地方必须能透明地使用其子类的对象 里氏 ...
- Java设计模式之二十八(里氏代换原则)
一.什么是里氏代换原则 里氏代换原则(Liskov Substitution Principle):一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类和子类对象的区别.也就 ...
- 里氏代换原则 举例 分析
里氏代换原则 定义:里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一. 目的:里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现.L ...
最新文章
- HarmonyOS UI 开发 vp ,fp , px 以及写具体数字的 理解
- devops和docker_通过免费的2小时Docker课程学习DevOps基础知识
- 2021年春季学期-信号与系统-第七次作业参考答案-第一小题
- spring-cloud:熔断监控Hystrix Dashboard和Turbine的示例
- python怎么编写视觉识别_Python视觉识别--OpenCV色彩空间\图像运算\ROI(四)
- node遍历给定目录下特定文件,内容合并到一个文件
- [mybatis]缓存_缓存有关的设置以及属性
- Java System类exit()方法及示例
- 只用一套解决方案,就可解决80%的交通物流行业信息难题
- 【Java从入门到头秃专栏 6】语法篇(五) :多线程 线程池 可见、原子性 并发包 Lambda表达式
- 草莓软件验证系统源码 附带易语言模块
- CentOS项目实例之一--操作系统安装
- *** ERROR L107: ADDRESS SPACE OVERFLOW
- 音乐彩灯控制器C语言程序,基于单片机的LED彩灯控制器
- Android Launcher研究与开发——桌面的初步定制化
- js中的Image对象
- 天龙八部手游服务器维护公告,天龙八部手游 近期更新维护公告
- k8s-存储-Secret
- 用python证明采样定理_如何理解 Nyquist 采样定理?
- 模拟赛20200228(yyq)【右链+dfs序,子树管辖,聚集水流问题】
热门文章
- 自定义域名:为自己的CSDN博客添加自定义域名吧!
- 正则表达式 匹配任意长度的字符
- 用python每日更换“必应图片”为“桌面壁纸”
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx分解线xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- Python 相关文件常见的后缀名详解
- 力学专业做cae需要学c语言吗,CAE工程师是需要掌握力学知识到何种程度_
- 如何建设IDC数据中心机房?需要办理哪些许可证和资质【技术篇】华信网通帮您解答!
- 使用 SysRq 查看系统信息
- Nginx的负载均衡 - 最少连接 (least_conn)
- 1]解决java.util.concurrent.RejectedExecutionException