设计原则-里氏替换原则

六大设计原则之 里氏替换原则 (Liskov Substitution Principle | LSP) 目录 前言 里氏替换原则 定义 场景 特点 优点 栗子 正例 特例1 特例2 前言 OO(Object Oriented 面向对象) 设计的六大原则:OCP(开闭原则),DIP(依赖倒置原则),ISP(接口隔离原则),LSP(里氏替换原则),SRP(单一职责原则),LKP(迪米特法则) 里氏替换原则 定义 面向对象的基本设计原则之一,里氏替换原则中说,任何基类可以出现... 阅读详情
里氏替换原则(Liskov Substitution Principle,LSP)

里氏替换原则是我认为其他几个设计原则中比较难以掌握一种,首先他的定义十分晦涩。

假如存在,一个类型T,和已经被实例的对象O

还存在,另一个类型T2,和已经被实例的对象O2

那么存在以下情况,将所有类型为T的对象O都替换成类型T2的对象O2,程序的行为没发生什么改变。

看到这一句话给我的第一个感觉是,这讲的一定是父子关系,这是第一点。

第二点,如果说即便替换了对象,方法的功能或者说行为没有改变,也就意味着子类只是对原有父类的功能进行了他独有的增强,本质还是做了相同事,例如父类做了跳高的行为,而子类只是穿上了弹簧鞋子,跳的更高了。本质上还是跳高,所以你替换成什么,都不会影响他原有的逻辑。

所以我们总结一下就是:子类可以扩展父类的功能,但是不能改变父类原有的功能。。

以下是我从找到的资料粘贴下来的说明,我觉得讲得很好。

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

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

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

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

之前讲开闭原则的时候留了一个坑,就是获取价格的时候。

public class TomatoEggDiscountFood extends TomatoEggFood {
    public TomatoEggDiscountFood(Integer id, String name, Double price) {
    	super(id, name, price);
    }
    public Double getOriginPrice(){//这里其实违背了里氏替换法则,后会讲解,这里留个坑
    	return super.getPrice();
    }
    public Double getPrice(){
    	return super.getPrice() * 0.8;//修改的行为
    }
}

这里其实存在问题,虽然说我们为了获得打折后的炒蛋的价格,而去重写了父类的方法,但是我们可以发现,这里其实不适用于里氏替换法则,因为当我们将TomatoEggDiscountFood 替换成TomatoEggFood的时候,getPrice的行为就变得奇怪了,因为钱涨了?虽然这都是属于付钱,但是你可以决定让我支付宝或者微信付款,但是你多收我钱是几个意思。所以这里付钱的行为你可以增强,但是具体付钱的金额,导致违背了里氏替换。

解决这个方法很简单。我们别重写,额外定义我们自己独有的方法不就完了吗。

public class TomatoEggDiscountFood extends TomatoEggFood {
    public TomatoEggDiscountFood(Integer id, String name, Double price) {
    	super(id, name, price);
    }
    public Double getDisCountinPrice(){//想获得打折,调用这个方法就可以了。
    	return super.getPrice()*0.8;
    }
    public Double getPrice(){
    	return super.getPrice();
    }
}

想替换的时候也不要紧,因为你的父类不可能点出getDisCountinPrice方法,所以也不需要担心会被替换的问题。

所以里氏替换的优点,我们也可以总结一下。

1、约束继承泛滥,开闭原则的一种体现。

2、加强程序的健壮性,同时变更时也可以做到非常好的兼容性,提高程序的维护性、扩展性。降低需求变更时引入的风险。

【愚公系列】面向对象设计原则(三)-里氏替换原则(Liskov Substitution Principle or LSP) 面向对象设计原则是一些通用的软件设计原则,用于指导软件设计人员开发高质量、可扩展、可维护的软件系统。这些原则的作用如下:提高软件系统的可维护性:遵循面向对象设计原则可以将代码分解为更小、更专注的模块,从而降低代码的复杂性和耦合度,提高系统的可读性和可维护性。提高软件系统的可扩展性:开放封闭原则可以帮助软件系统更容易地适应变化,降低对现有代码的影响,从而提高软件系统的可扩展性和灵活性。 阅读详情

相关推荐

[TI板]MSPM0G3507——keil环境配置+烧录配置+vscode配置+空工程迁移+点灯+芯片解锁教程

本文介绍了MSPM0G3507开发环境的配置与烧录方法。主要内容包括:1)下载安装芯片支持包和SDK开发工具;2)通过串口或DAPLink两种方式实现程序烧录,详细说明了UniFlash软件的使用步骤和常见问题解决方法;3)简要提及工程迁移和LED点灯等基础操作。文章提供了完整的开发环境搭建指南,涵盖从软件安装到实际烧录的全过程,并附有相关工具下载链接和操作截图,帮助开发者快速上手MSPM0G3507开发。

qq_23220445的博客 1万+

设计模式六大原则(2):里氏替换原则

肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑。其实原因就是这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的。 定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类...

yuanlanjun 2057

低功耗基础概念——Level Shifter cell补充

信号跨越不同级别电压模块进行驱动时,需要使用level shifter。 H2L Level shifer 从高电压到低电压的level shifter,可以是两个反相器的串联。 输入高电平区域信号INH,输出低电平区域信号OUTL,注意供应电源由低电压模块提供,即图中的VDDL。 从图中可以看出,H2L的level shifter只会引入一个buffer的延迟,对时序的影响较小。 L2H Level shifer 用低电压区域的信号invert和buffer之后得到的一对信号来驱动工作在高电压区域的交

qq_36480087的博客 1万+

OO设计原则 -- Liskov Substitution Principle: OO设计的LSP里氏替换原则

概要  Functions that use pointers or references to base classesmust be able to use objects of derived classes without knowing it. 所有引用基类的地方必

亿言 7108

机器学习-02 模型的评估与选择

2.1 误差与过拟合 我们将学习器对样本的实际预测结果与样本的真实值之间的差异成为:误差(error)。定义: 在训练集上的误差称为训练误差(training error)或经验误差(empirical error)。 在测试集上的误差称为测试误差(test error)。 学习器在所有新样本上的误差称为泛化误差(generalization error)。 显然,我们希望得到的是在新样本上表现得很好的学习器,即泛化误差小的学习器。因此,我们应该让学习器尽可能地从训练集中学出普适性的“一般特征”,这

一个小白 1704

Dify工作流教程|以抓取网页并更新知识库为例详细讲解工作流编排过程(附DSL文件)

{"name": "{新建的title变量}","text": "新建的content变量","indexing_technique": "high_quality","process_rule": {"mode": "automatic"}}有没有很痛苦,明明添加书签的网页,当你想阅读的时候,总是找不到或者好不容易找到了,发现网页404了。如果有个小工具,直接能把你输入的链接内容抓取下来,并且加入到你的知识库中,你说他香不香。无法获取授权的,也可以使用网页抓取工具,这个是免费的,抓取效果也可以。

同名公众号:dify实验室 1万+

设计原则之-里氏替换原则(Liskov‘s Substitution Principle,LSP)

定义 里氏替换原则是Barbara Liskov1与1988年提出来的。原文是: What is wanted here is something like the following substitution property: If for each object of type S there is an object of type T such that for all program...

jaune162的专栏,最新动态请关注:https://jaune162.blog 725

VCS的增量和分离编译

vcs的增量和分离编译

yunduor909的博客 3302

[设计原则3] LSP 里氏替换原则

LSP原则定义: 定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。 定义2:所有引用基类的地方必须能透明地使用其子类的对象。

u013150151的专栏 1182

五大经典遥感数据集对比:LoveDA、Potsdam、Toronto、Vaihingen、Massachusetts Roads选哪个?

本文深度对比了LoveDA、Potsdam、Vaihingen、Toronto和Massachusetts Roads五大经典遥感数据集。针对城市监测、道路提取、土地分类等不同任务,从分辨率、标注质量、数据规模及场景多样性等核心维度进行分析,为研究者根据项目目标、硬件条件与应用场景选择最合适的遥感数据集提供决策指南。

weixin_29057065的博客 237

WPF实战:HelixToolkit 3D图形开发入门指南

本文详细介绍了如何使用HelixToolkit在WPF中进行3D图形开发,从环境搭建到创建第一个3D程序(如彩色立方体),再到进阶技巧和常见问题排查。通过实战案例和性能优化建议,帮助开发者快速掌握3D场景构建和模型导入技术,提升开发效率。

weixin_29197051的博客 758

设计原则-里氏替换原则(Liskov Substitution Principle LSP)

意图 规定继承 定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。 定义2:所有引用基类的地方必须能透明地使用其子...

230

沙猫群优化算法(SCSO)详解:从沙漠生存智慧到全局优化引擎

本文详细介绍了沙猫群优化算法(SCSO),这是一种新型元启发式优化算法,灵感来源于沙猫在沙漠环境中的卓越狩猎行为。SCSO通过模拟沙猫的低频探测能力和精确攻击策略,将优化问题转化为搜索和捕获"猎物"的过程。算法核心包括探索阶段(全局搜索)和开发阶段(局部精细搜索),通过灵敏度范围模型和自适应控制参数实现两者的平衡。SCSO具有参数简单、收敛性能好等优点,适用于解决复杂全局优化问题。

qq_42212808的博客 201

【设计原则】里氏替换原则(LSP):构建稳健继承体系的黄金法则

里氏替换原则(Liskov Substitution Principle, LSP)是面向对象设计SOLID原则中的"L",由Barbara Liskov在1987年提出。所有引用基类(父类)的地方必须能透明地使用其子类的对象子类必须完全实现父类的抽象方法子类可以扩展父类功能但不能改变原有行为子类方法的前置条件不应强于父类子类方法的后置条件不应弱于父类优先使用组合而非继承保持继承层次扁平化使用设计模式:策略模式模板方法模式装饰器模式定期进行代码审查编写契约测试。

OpenSeek的博客 1989

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

OO设计原则 -- Liskov Substitution Principle: 里氏替换原则(LSP)

概要  Functions that use pointers or references to base classesmust be able to use objects of derived classes without knowing it. 所有引用基类的地方必须能透明地使用其子类的对象。  即: ◇...

行云间 820

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OOD设计原则之里氏替换原则(LSP)

里氏替换原则(Liskov Substitutiion Principle,LSP)被称作继承复用的基石,它的提出甚至要早于OCP。不过遗憾的是,由于对这一原则的理解各不相同,经过多次的翻译、转述,LSP成了OOD设计原则中争议最多的话题之一。其实早在1987年的OOPSLA大会上,麻省理工学院(MIT)计算机科学实验室的Liskov女士就发表了经典文章Data Abstraction and

Brookes的专栏 8736

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

python 设计模式(二) 六大设计原则二 里氏替换原则(Liskov Substitution Principle)

里氏替换原则简称LSP。定义:所有引用基类的地方必须能够透明地使用其子类的对象。所谓对象是一组状态和一系列行为的组合。状态是对象的内在特性,行为是对象的外在特性。LSP所表述的就是在同一个继承体系中的对象应该有共同的行为特征。我们在设计对象时是按照行为进行分类的,只有行为一致的对象才能抽象出一个类来。因此,如果说鸵鸟和企鹅属于鸟类的话,就违背了里氏替换原则。如何规范地遵从里氏替换原则:1 子类必须...

ruguowoshiyu的博客 1520

设计原则之里氏替换原则(LSP)

简介 里氏替换原则是在做继承设计时需要遵循的原则,不遵循了 LSP 的继承类会带来意想不到的问题。 定义 里氏替换原则(Liskov Substitution Principle) 是由 Barbara Liskov 在 1987 年提出来的,Liskov 是她的姓,国内翻译成 里氏。 原则...

chj287522860的博客 303

IOS设计模式的六大设计原则之里氏替换原则(LSP,Liskov Substitution Principle)

定义 里氏替换原则的定义有两种,据说是由麻省理工的一位姓里的女士所提出,因此以其名进行命名。 定义1:如果对一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1所定义的程序P中在o1全都替换成o2时,程序的行为不发生任何变化,那么T2为T1的子类。 定义2:所有引用父类的地方都必须能够透明地使用其子类对象。 定义解读 其实两个定义所表达的意思都相...

weixin_33851604的博客 357

六大设计原则之LSP

简介:里氏替换原则(Liskov Substitution Principle),简称LSP。 定义:如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。 定义:所有引用基类的地方必须能透明地使用其子类的对象。 总结:父类替换成子类而不会产生任何错误或异常,反之,不一定成立。 ...

不死鸟的传说 1924

OO设计原则 OO设计的LSP里氏替换原则

概要  Functions that use pointers or references to base classesmust be able to use objects of derived classes without knowing it. 所有引用基类的地方必须能透明地使用其子类的对象。    即: ◇ 所以使用基类代码的地方,用派生类代码替换后,能够正确的执行动作处理。

yj_021219的专栏 412

六大设计原则之里氏替换原则(LSP)

一、SOLID 设计模式的六大原则有: Single Responsibility Principle:单一职责原则 Open Closed Principle:开闭原则 Liskov Substitution Principle:里氏替换原则 Law of Demeter:迪米特法则 Interface Segregation Principle:接口隔离原则 Dependence Inversion Principle:依赖倒置原则 把这六个原则的首字母联合起来(两个 L 算做一个)就是 SOLID

就是喜欢JAVA 961

【iOS-设计模式】六大设计原则之里氏替换原则(LSP,Liskov Substitution Principle)...

定义 里氏替换原则的定义有两种,据说是由麻省理工的一位姓里的女士所提出,因此以其名进行命名。 定义1:如果对一个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2,使得以 T1 所定义的程序 P 中在 o1 全都替换成 o2 时,程序的行为不发生任何变化,那么 T2 为 T1 的子类。 定义2:所有引用父类的地方都必须能够透明地使用其子类对象。 定义解读 其实两个定义所...

GSNICE 1332
上一篇: 设计原则-迪米特原则与合成复用原则
下一篇: 设计模式-单例模式详解
PopCandier
博客等级 码龄9年 19粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值