七、LSP 里氏替换原则
子类的对象提供了父类的所有行为,且加上子类额外的一些东西(可以是功能,可以是属性)。当程序基于父类实现时,如果将子类替换父类而程序不需修改,则说明符合LSP原则。
这个解释看的似懂非懂,再看下面更进一步的解释:
函数使用指向父类的指针或引用时,必须能够在不知道子类类型的情况下使用子类的对象。
子类必须能够替换成它们的父类
这其中存在这样的概念:方法调用者(C)和方法提供者(P)。C调用P提供的方法,P的方法返回给C处理的结果。中间的过程C是不需要知道,也不会知道的。当C调用P的方法时,如果将P替换成sub_P的子类,那么C得到的输出结果也是正确的,C无需修改自身。
这里还有个问题是如何满足LSP原则,或者说,什么情况下子类才可以替换父类?要满足LSP原则,需要遵守以下原则:
- sub_P必须实现或继承P的所有公共方法,否则C调用P中有,而sub_P中没有的方法,那么运行时就会出错。
- sub_P每个方法的输入参数必须和P一样,否则调用父类的代码不能调用子类。
- sub_P每个方法的输出必须不比P少,否则基于父类的输出做的处理就无法完成。
第三条中所说的“不比父类少”,是指子类的输出可以比父类多,也就是父类方法的输出是子类方法的子集。
面向对象语言提供的继承,已经天生的满足了1,2两条。除非是子类重写父类的方法,那么就要依照1,2的原则来重写。(重写与重载的区别:重写要求函数名,传参个数\类型,返回值类型必须相同,访问修饰符子类的必须大于父类的。仅函数名相同,其他不同,则为重载。重载是多态的一种实现 详解传送门)
从上面的三条原则中可以看出约定只是约束了父类、子类的输入输出,并没有约束中间的处理过程。
经典的LSP例子:长方形与正方形。数学概念中正方形是长方形的特殊情况,也就是说正方形是长方形的子类。但是在面向对象领域中,正方形是不能作为长方形的子类的。因为正方形设置了高就等于设置了宽,设置了宽就等于设置了高。那么按照长方形的计算规则,最终面积将是最后一次设置高或宽的数值的乘积。长方形高5,宽4,面积为20。替换成正方形后,最后一次设置的如果是高的值,那么面积将是25;如果是宽,那么面积将是16。都不等于20。那么就不能用正方形来替换长方形,否则C调用的结果会不同。
七、LSP 里氏替换原则的更多相关文章
- 六大设计原则(二)LSP里氏替换原则
里氏替换原则LSP(Liskov Subsituation Principle) 里氏替换原则定义 所有父类出现的地方可以使用子类替换并不会出现错误或异常,但是反之子类出现的地方不一定能用父类替换. ...
- 设计模式原则(2)--Liskov Substitution Principle(LSP)--里氏替换原则
1.定义: 所有引用基类(父类)的地方必须能透明地使用其子类的对象.这一原则与继承紧密相关.如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的 ...
- 第2章 面向对象的设计原则(SOLID):2_里氏替换原则(LSP)
2. 里氏替换原则(Liskov Substitution Principle,LSP) 2.1 定义 (1)所有使用基类的地方必须能透明地使用子类替换,而程序的行为没有任何变化(不会产生运行结果错误 ...
- 里氏替换原则(Liskov Substitution Principle)
开放封闭原则(Open Closed Principle)是构建可维护性和可重用性代码的基础.它强调设计良好的代码可以不通过修改而扩展,新的功能通过添加新的代码来实现,而不需要更改已有的可工作的代码. ...
- .net学习之继承、里氏替换原则LSP、虚方法、多态、抽象类、Equals方法、接口、装箱拆箱、字符串
1.继承(1)创建子类对象的时候,在子类对象中会为子类对象的字段开辟空间,也会为父类的所有字段开辟空间,只不过父类私有的成员访问不到(2)子类从父类继承父类所有的非私有成员,但是父类的所有字段也会创建 ...
- 【面向对象设计原则】之里氏替换原则(LSP)
里氏代换原则由2008年图灵奖得主.美国第一位计算机科学女博士Barbara Liskov教授和卡内基·梅隆大学Jeannette Wing 教授于1994年提出,所以使用的是这位女博士的性命名的一个 ...
- 里氏替换原则(LSP)
替换原则由MIT计算机科学实验室的Liskov女士在1987年的OOPSLA大会上的一篇文章中提出,主要阐述有关继承的一些原则,故称里氏替换原则. 2002年,Robert C.Martin出版了一本 ...
- 面向对象设计原则三:里氏替换原则(LSP)
里氏替换原则(LSP)定义:在任何父类出现的地方都可以用它的子类类替换,且不影响功能.解释说明:其实LSP是对开闭原则的一个扩展,在OO思想中,我们知道对象是由一系列的状态和行为组成的,里氏替换原则说 ...
- 里氏替换原则(Liskov Substitution Principle) LSP
using System; using System.Collections.Generic; using System.Text; namespace LiskovSubstitutionPrinc ...
随机推荐
- Java 压缩文件夹工具类(包含解压)
依赖jar <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons ...
- Docker 入门教程与实践
title: Docker 入门教程与实践 tags: Docker ---- 在Windows上安装Docker客户端 1.下载Docker TollBox: https://docs.docker ...
- map和set的遍历
map: 1.通过获取Entry: Entry的iterator for(Map.Entry<Float,String> entry : map.entrySet()) { System ...
- @NotEmpty、@NotNull、@NotBlank 的区别
@NotEmpty 用在集合上面(不能注释枚举) @NotBlank用在String上面 @NotNull用在所有类型上面 1. @NotEmpty Asserts that the annotate ...
- Python 初始—(列表)
列表切片 数组data=[a,b,c,d,e] print(data[1,3])#取出b,c , 如果用-号切片则是反向取数,那么去取出来的数为data[-3,-1],如果是0则默认不填 列表追加 d ...
- 使用工具Android Studio实现一个简单的Android版的新闻APP
目的: 这是我学完Android课程后所写的一个小的.简单版的新闻APP 技术概要: 用到了SQLite数据库,用它来存储每篇新闻下的评论 新闻的来源是新浪新闻,我通过使用Fiddler来对新浪新闻A ...
- LeetCode997. Find the Town Judge
题目 在一个小镇里,按从 1 到 N 标记了 N 个人.传言称,这些人中有一个是小镇上的秘密法官. 如果小镇的法官真的存在,那么: 小镇的法官不相信任何人. 每个人(除了小镇法官外)都信任小镇的法官. ...
- Centos7下MySql5.7安装及配置
安装MySql 软件包: mysql-community-libs-5.7.22-1.el7.x86_64.rpm mysql-community-common-5.7.22-1.el7.x86_64 ...
- JQuery实现子级选择器
效果图如下: HTML代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
- 简单了解,使用oracle中的索引,表分区
索引的分类 如下: 物理分类 逻辑分类 分区或非分区索引 单列或组合索引 B树索引(标准索引) 唯一或非唯一索引 正常或反向键索引 基于函数索引 位图索引 B树索引 b树索引通常也称为标准索引,索 ...