Liskov Substitution Principle里氏代换原则(LSP)

Claude Code 完整详解(Anthropic 官方 AI 编程 Agent) 它是运行在终端(Terminal)的 AI 编程代理,不是普通 IDE 插件;你用自然语言发指令,它自主规划步骤、读写项目文件、执行系统命令、排查 Bug、处理 Git 工作流,是能真正动手干活的 AI 程序员。真正的AI 开发代理人,不止写代码,还能执行开发全流程超长全局上下文,大型项目理解碾压传统补全工具终端原生 + IDE 双接入,开发流程无割裂代码质量、可读性、工程规范性普遍偏高权限安全机制完善,修改前预览、可随时中断回滚。 阅读详情

Liskov Substitution Principle里氏代换原则(LSP)

1.什么是LSP

严格定义:Let q(x) be a property provable about objects x of type T, then q(y) should be provable for objects y of type S where S is a subtype of T.

也就是说假设q(x)是关于类型T的对象x的一个可证明性质,那么q(y)应该对于类型S的对象y的也是可证明的,其中S是T的子类型。

通俗地说,也就是在可以使用父类的场景,都可以用其子类代替而不会有任何问题

2.为什么要遵循LSP

LSP原则保证了子类型多态,也就是客户端可用统一的方式处理不同类型的对象

也正因为这个原则, 使得继承复用成为了可能, 只有当子类可以替换掉父类, 软件单位的功能不受到影响时,父类才能真正被复用, 子类也能够在父类的基础上增加新的行为,而正是由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展

换言之程序遵循Liskov替换原则,就能降低继承带来的复杂度

而管理复杂度是软件的重要使命之一

3.具体要求

  1. 子类型可以增加方法,但是不可以删除
  2. 子类型需要实现抽象类型中的所有未实现的方法
  3. 子类型中重写的方法必须有相同的或子类型的返回值(即协变co-variance)
  4. 子类型中重写的方法必须使用相同类型的或符合contra-variance(逆变)的参数
  5. 子类型中重写的方法不能抛出额外的异常
  6. 子类型中的不变量要求要更强
  7. 对于方法的spec,需要子类型的spec更强,即前置条件更弱,后置条件更强

协变co-variance也就是说从父类型到子类型,变的越来越具体

在这里插入图片描述

而逆变contra-variance则相反,从子类型到父类型,越来越抽象
在这里插入图片描述

4.示例

通过例子来看看在设计时什么时候是符合LSP原则的:

假设我们有两个类,一个长方形,一个正方形,正方形是长方形的子类

又有一个方法resize()能够使得输入的长方形的长增加至超过宽

class Rectangle
{
  @invariant h>0 && w>0;
  private int h;
  private int w;
  Rectangle(int h,int w)
  {
    this.h = h;
    this.w = w;
  }
   public void getH()
  {
    return this.h;
  }
  public void getW()
  {
    return this.w;
  }
  public setH(int h)
  {
     this.h = h;
  }
}

class Square extends Rectangle
{
  @invariant h>0 && w>0 && h==w;
  Square(int w)
  {
    super(w,w);
  }
  
  public setH(int h)
  {
     this.h = h;
     this.w = h;
  }
}


    /**
     * 长方形的长不短的增加直到超过宽
     * @param r
     */
    public void resize(Rectangle r)
    {
        while (r.getH() <= r.getW() )
        {
            r.setH(r.getH() + 1);
        }
    }

如果我们在resize()中输入的是父类型长方形,代码显而易见是可以正常运行的,但是将其替换成其子类型时,我们很容易可以预期到,这个正方形会自增它的边直到数据溢出,也就是说,这个时候用子类代替父类得不到相同的结果,也就不符合LSP原则

那么原因出现在哪里?
出现在我们在不经意间override了setH()方法

所以为了保证遵守LSP原则,尽量不要重写方法,这样就可以保证继承自父类的属性和功能在子类同样适用,如果实在需要重写,就需要遵守上述提到的规则3,4,5,尤其是对于mutator,由于我们不清楚外部调用父类的对象的方法,所以如果重写mutaor方法,就很容易导致错误,比如上例

5.总结

在实际编程中,我们常常会通过重写父类的方法来完成新的功能,这样写起来虽然简单,但是这样很可能会违背LSP原则,使得整个继承体系的可复用性会比较差,特别是运用多态比较频繁时,程序运行出错的几率非常大。

使用 MATLAB/Simulink + Simscape Electrical 构建一个他励直流电机的启动与制动过程仿真模型 直流电机在工业控制、电动车辆、自动化设备中广泛应用。其中,他励直流电机(Separately Excited DC Motor)因其励磁绕组与电枢绕组分别供电,具有良好的调速性能和启动特性,常用于需要平稳启动和精确控制的场合。在实际应用中,电机的启动过程和制动过程对电网、机械系统以及电机本身都具有重要影响。因此,仿真分析他励直流电机的启动与制动特性,是电机控制设计的重要环节。本文将详细介绍如何使用构建一个他励直流电机的启动与制动过程仿真模型,并通过仿真分析其动态响应。本文详细介绍了如何使用构建一个。 阅读详情

相关推荐

freeswitch之呼叫中心acd模块开发

一、定义: ACD(Automatic Call Distributor) 自动呼叫分配,也叫智能选择座席。它是呼叫中心整个前台接入系统逻辑功能的描述:把接入的呼叫转接到正确的座席员桌前。ACD是现代呼叫中心有别于一般的热线电话系统和自动应答系统的重要标志,其性能的优劣直接影响到呼叫中心的效率和顾客的满意度。 二、ACD包含的功能点: 1 、程控交换功能 ACD在本质上也是交换机的一种类型,必须具有程控交换最基本的话务交换功能。 2 、排队功能 ACD必须具有话务排队的功能,所谓排队是指在内线都

飞鸟的博客 1870

Java面向对象中里式替换原则(Liskov Substitution Principle,LSP)、 开闭原则(OCP)、接口隔离原则(ISP)和依赖倒置原则(DIP)

举个例子说明Java面向对象中里式替换原则(Liskov Substitution Principle,LSP)、 开闭原则(OCP)、接口隔离原则(ISP)和依赖倒置原则(DIP)

ALONG的博客 602

FFmpeg HDR视频转SDR视频命令

之前蓝光盘电影多是AVC 1080p 8bit SDR格式视频,近两年4K电影流行,下载的蓝光电影多是HEVC 2160p 10bit HDR视频格式。 ffprobe查看有如下属性: # 10bit HDR Stream #0:0(eng): Video: hevc (Main 10), yuv420p10le(tv, bt2020nc/bt2020/smpte2084), 3840x2160 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 23.98

彼此当年少,莫负好时光 1万+

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

里氏替换原则的定义是:“继承必须确保超类(基类)所拥有的性质在子类中仍然成立。”这一原则强调了子类与基类之间的继承关系应当遵循一定的规则,以确保在替换基类对象时,程序的行为保持不变。里氏替换原则是实现开闭原则的重要方式之一,它确保了软件系统的可扩展性和可维护性,同时降低了需求变更时引入的风险。提高代码的健壮性:通过确保子类能够替换基类而不影响程序行为,减少了因继承关系不当而导致的错误。降低程序出错的可能性:子类在扩展功能时,必须保持与基类一致的接口和行为,从而降低了程序出错的风险。增强软件的可维护性。

shiming8879的博客 1846

概率数据关联(PDA):多目标跟踪的基石算法

1. 为什么需要概率数据关联? 2. 核心思想与假设条件 3. 算法核心:概率分配与状态更新 4. 典型应用场景与优势 5. 挑战与改进方向 6. 下期预告

qq_44965657的博客 1464

用STM32F103单片机控制电调制动无刷电机

用电调控制无刷电机制作遥控飞艇 蓝牙控制 调控电调 无刷电机 用电调控制无刷电机制作遥控飞艇 代码区 mian.c #include "delay.h" #include "sys.h" #include "usart.h" #include "usart3.h" #include "timer.h" #include "led.h" #include "key.h" int main(v...

子非鱼 的博客 2万+

里氏替换原则(Liskov Substitution Principle,LSP)

定义 继承必须确保超类所拥有的性质在子类中仍然成立 Inheritance should ensure that any property proved about supertype objects also holds for subtype objects 里氏替换原则主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中蕴含的原理。里氏替换原则是继承...

Hokuto·Liu 342

Nvidia Isaac Sim安装与配置 入门教程 2024(2)

Isaac Sim 安装和配置教程将指导用户完成从下载软件到设置和运行仿真的全过程。教程内容包括安装必要的依赖项、配置系统环境、配置Omniverse环境以及调试和优化仿真环境的步骤。通过详细的操作步骤和图文并茂的说明,用户可以快速上手 Isaac Sim,构建出高质量的机器人仿真环境,实现其研究和应用目标。

m0_56661101的博客 2万+

06.里氏替换原则(Liskov Substitution Principle,LSP)

1.定义 指如果对每一个类型为 T1 的 对象 o1,都有类型为 T2 的对象 o2,使得以 T1 定义的所有程序 P 在所有的对象 o1 都替换 成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。 定义看上去还是比较抽象,我们重新理解一下,可以理解为一个软件实体如果适用一 个父类的话,那一定是适用于其子类,所有引用父类的地方必须能透明地使用其子类的 对象,子类对象能够替换父类对象,而程序逻辑不变。 根据这个理解,我们总结一下: 引申含义:子类可以扩展父类的功能

棒棒的邦邦 226

音频格式之AAC:(2)AAC封装格式ADIF,ADTS,LATM,extradata及AAC ES存储格式

本文主要1-3部分介绍AAC封装格式ADIF,ADTS和LATM,同时因为从mp4等封装容器有extradata模式,故也第4部分介绍extradata模式。最后第5部分介绍AAC压缩数据存储方式。

littlezls的博客 4936

Xshell 连接 kali 虚拟机教程

启动ssh服务,启动后重新查看ssh服务状态,如下图active(running)正常。至此便可以直接使用Xshell登录kali系统了。至此虚拟机已经可以上网。-查看ssh服务状态。

qq_40726937的博客 2219

里氏代换原则(Liskov Substitution Principle、LSP)

一、概念 氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。   简单的理...

qq_42499188的博客 688

【TC3xx芯片】TC3xx DMA模块详解

TC3xx DMA模块详解

qq_36056498的博客 5916

里氏代换原则 Liskov Substitution Principle

里氏代换原则 Liskov Substitution Principle 使得开放-封闭成为可能 继承性的思考和说明 继承包含这样一层含义:父类中已经实现的方法,实际上是在设定规范和契约,虽然它不强制要求所有的子类必须遵循这些契约,但是如果子类对这些已经实现的方法任意修 改,就会对整个继承体系造成破坏。 阅读下面一个程序 package liskov; class A{ public int...

qq_45462042的博客 358

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

里氏代换原则 (Liskov Substitution Principle, LSP)

里氏代换原则 (Liskov Substitution Principle, LSP) 定义严格表达:如果对每一个类型为T1的对象O1,都有类型为T2的对象O2,使得以T1定义的所有程序P在所有的对象O1都代换成O2时,程序P的行为没有变化,那么类型T2是类型T1的子类型。 简单说,任何基类可以出现的地方,子类一定可以出现。 从代码重构的角度理解:西方著名的思辨,正

moon1128的专栏 3876

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

里氏代换原则(Liskov Substitution Principle, LSP)(转载)

里氏代换原则(Liskov Substitution Principle, LSP) 1 什么是里氏代换原则     里氏代换原则是由麻省理工学院(MIT)计算机科学实验室的Liskov女士,在1987年的OOPSLA大会上发表的一篇文章《Data Abstraction and Hierarchy》里面提出来的,主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用...

xiaoyaocai2011的博客 156

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

里氏代换原则(Liskov Substitution Principle, LSP)

4 里氏代换原则(Liskov Substitution Principle, LSP)   4.1 什么是里氏代换原则     里氏代换原则是由麻省理工学院(MIT)计算机科学实验室的Liskov女士,在1987年的OOPSLA大会上发表的一篇文章《Data Abstraction and Hierarchy》里面提出来的,主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候...

Mr.Right 351

里氏代换原则(Liskov Substitution Principle LSP)

里氏替换原则:只要父类出现的地方,子类就出现。 优点: 缺点:

程序人生 680

设计模式:里氏代换原则(Liskov Substitution Principle,LSP)介绍

子类可以扩展父类的功能,但不能收缩或修改父类已有的功能。也就是说,子类可以在父类的行为基础上进行扩展,但不能修改或删除父类已有的行为。里氏代换原则(Liskov Substitution Principle,LSP)是面向对象设计原则的一部分,它强调。子类方法的返回类型必须与父类方法的返回类型兼容,这意味着子类方法的返回值可以是父类方法返回值的子类型。子类继承父类时,必须实现父类中声明的所有抽象方法,并且保持方法签名和语义的一致性。换句话说,子类对象应该可以在不改变程序正确性的前提下替换掉父类对象。

captain 1187

里氏代换原则(Liskov Substitution Principle)

作用 它指导我们如何正确地进行继承与派生,并合理地重用代码! 定义 子类型必须能够替换掉它们的父类型、并出现在父类能够出现的任何地方。 这个就是尽量用多态的方法编程,也就是GRASP模式中的多态。 如果对于每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型。 换言之,一个软

软件设计专栏 1887

设计模式六大原则——里氏代换原则(LSP,Liskov Substitution Principle)

里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与

司马懿的西山居 1478

LSP The The Liskov Substitution Principle(里氏代换原则)

1 什么是里氏代换原则     里氏代换原则是由麻省理工学院(MIT)计算机科学实验室的Liskov女士,在1987年的OOPSLA大会上发表的一篇文章《Data Abstraction and Hierarchy》里面提出来的,主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中的蕴涵的原理。2002年,我们前面单一职责原则中提到的软件工程大师Ro

nodeathphoenix的专栏 917

里氏代换原则(The Liskov Substitution Principle)

 里氏代换原则由Barbara Liskov于1988年提出,它最开始的定义如下:If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is s

2029

构架师之路(4) 里氏代换原则(Liskov Substitution Principle, LSP)

4、里氏代换原则(Liskov Substitution Principle, LSP) 4.1什么是里氏代换原则 里氏代换原则是由麻省理工学院(MIT)计算机科学实验室的Liskov女士,在1987年的OOPSLA大会上发表的一篇文章《Data Abstraction and Hierarchy》里面提出来的,主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时...

weixin_30487317的博客 97

[设计模式原则]里氏代换原则(Liskov Substitution Principle ,LSP)

里氏替换原则 里氏是这个原则提出者的名字 关键在替换 我们一直强调 设计是开闭的 对于扩展开放,对于修改关闭 扩展就是新的类型 其中之一就是子类 好的设计会把握住抽象 后期扩展用子类具体化扩展 这其中一个默认的前提就是 子类不能改变抽象父类的业务规则 这样才能在后期扩展的时候 用子类来覆盖父类 达到扩展业务的目的 现在可以说说 什么是里氏替换 就...

weixin_30642869的博客 208

深入浅出设计模式原则之里氏代换原则(Liskov Substitution Principle)

一、里氏替换原则(源自里氏替换原则——面向对象设计原则) 1.1 里氏替换原则的定义 里氏替换原则(Liskov Substitution Principle,LSP)由麻省理工学院计算机科学实验室的里斯科夫(Liskov)女士在 1987 年的“面向对象技术的高峰会议”(OOPSLA)上发表的一篇文章《数据抽象和层次》(Data Abstraction and Hierarchy)里提出来的,她提出:继承必须确保超类所拥有的性质在子类中仍然成立(Inheritance should ensure th

浩瀚之水的专栏 541
上一篇: Java中的==与equals
下一篇: Java String.split拆分返回空数组?
Joe_hsj
博客等级 码龄8年 6粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值