面向对象的设计原则(3):LSP

《编程导论(Java)·2.1.1里氏替换原则》什么是LSP 你可以不知道继承、多态,但是必须知道里氏替换原则(Liskov SubstitutionPrinciple、LSP)。 阅读详情
子类型必须能够替换掉他们的基类型
 假设有一个函数f,它的参数为指向某个基类B的指针或引用,同样假设存在B的某个派生类D,如果把D的对象作为

 B类型传给f,会导致f出现错误的行为,那么D就违反了LSP
 Martin 举了个例子:
 public class Rectangle()
 {
  private int width;
  private int height;
  public void setWidth(int w)
  {
   this.width = w; 
  }
  public void setHeight(int h)
  {
   this.height = h;
  }
  public int getArea()
  {
   return this.height * this.width;
  }
 }

 很自然的Square从Rectangle继承而来,但是重写了两个方法,保证长和宽是一致的
 public class Square extend Rectangle()
 {
  
  public void setWidth(int w)
  {
   super.setWidth(w);
   super.setHeight(w);
  }
  public void setHeight(int h)
  {

   super.setWidth(h);
   super.setHeight(h);
  }
 }

 假设有下面的函数g
 void g(Rectangle r)
 {
  r.setWidth(5);
  r.setHeight(4);
  assert(r.getArea() == 20);
 }
 当传进来的对象是square时就会发生错误!!!这里就违反了Lsp
 基于DBC的设计:前置条件,后置条件,不变式(参见Meyer的书籍《基于DBC的设计》)

 Lsp使得OCP成为可能,子类型对父类型的可替换性必须是开发人员可以隐式依赖的东西,因此,如果没有显式的强制基类类型的契约,那些代码就必须良好并且明显的表达出这一点。

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

相关推荐

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

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

心有猛虎 细嗅蔷薇 623

面向对象设计原则--里氏替换原则(LSP)和依赖倒置原则(DIP)

面向对象设计原则–里氏替换原则(LSP)和依赖倒置原则(DIP)tags:设计模式 LSP–inheritance should ensure that any property proved about supertype objects also hold for subtype objects.

蛋子哥的博客 2600

狗都能看懂的MAML原理讲解和代码实现

meta-leaning指的是元学习,元学习是深度学习的一个分支,一个好的元模型(meta-learner)应该具备对新的、少量的数据做出快速而准确的学习。通俗的来讲, 对于人来说,给几张橘猫的图片让看一下,再给你几张没见过的英短猫图片,你一定能很快识别出来都是猫。但是对于神经网络来说,并非如此。如果让一个小汽车分类网络去识别不同的大货车,那效果肯定很差。而传统的CNN网络都是输入大量的数据,然后进行分类的学习。但是这样做的问题就是,神经网络的通用性太差了,根本达不到“智能”的标准。而人类的认知系统,可以通

个人学习笔记 6万+

第3章 里氏替换原则(LSP)

一、定义 (1)、所有使用基类的地方必须能够使用子类进行替换,而程序的行为不会发生任何变化(替换为子类之后不会产生错误或者异常)。    只有这样,父类才能真正被复用,子类能够在父类的基础上增减新的属性和行为。才能真正的实现多态行为。 (2)、当子类继承父类的时候,子类就拥有了父类的属性和行为。(注意:只是类型而已) 但是如果子类覆盖父类的某些方法,那么 原来使用父类的地方就可能出现错误。

每天进步一点点。。。的博客 2975

docker安装fastdfs+nginx配置

docker安装fastdfs+nginx,实现图片或文件的上传与下载

weixin_47325126的博客 2191

深入解析MSPM0系列Keil开发中‘ti_msp_dl_config.h‘缺失问题的根源与修复

本文深入解析TI MSPM0系列Keil开发中'ti_msp_dl_config.h'文件缺失问题的根源与修复方法。该错误常见于编译时提示file not found,主要因SysConfig工具未正确生成或工程路径配置错误导致。文章提供了从环境检查、手动生成文件到工程配置调整的系统化解决方案,帮助开发者快速解决这一常见KEIL开发难题。

gold的博客 970

六大设计原则之LSP

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

不死鸟的传说 1924

surfer10与Arcgis10.3 完美生成等值线和等值面方法

surfer10 与Arcgis10.3生成等值线和等值面的步骤如下: 1.准备surfer用的Book1.dat文件,格式如下: "x" "y" "z" 116.471992 40.809975 232 116.335556 40.700542 1235 116.541626 40.713333 214 116.73349 40.798607 566 2.在surfer中,选择Gr

哈里·雪利博客 1万+

设计模式:里式替换(LSP)跟多态有何区别?哪些代码违反了LSP?

如何理解“里式替换原则” 什么是“里式替换原则” SOLID 中的“L”对应的里式替换原则。里式替换原则的英文翻译是:Liskov Substitution Principle,缩写为 LSP。 其定义为:子类对象能够替换程序中的父类对象出现的任何地方,并且保证原来程序的逻辑行为不变以及正确性不被破坏。 举个例子。如下代码中,父类 Transporter 使用 org.apache.http 库中的 HttpClient 类来传输网络数据。子类 SecurityTransporter 继承父类 Tran

OceanStar的博客 778

电磁场仿真软件:Sonnet_(1).Sonnet软件概述

根据特定需求自定义仿真流程,如多频率点仿真、多边界条件仿真等。

kkchenjj的博客 1449

如何使用Agent框架来模拟群体智能?

Agent 框架作为人工智能领域的重要工具,可以模拟复杂的群体智能行为,广泛应用于社会科学、经济学和行为学等领域。

333

面向对象设计 里氏替换原则(LSP)

主目录:一个面向对象设计(OOD)的学习思路设计 引子: 有一只小麻雀在大平原上,飞呀飞~。飞累了,看见前方一个大鸟... 小麻雀:大鸟兄你好,本鸟叫麻雀!请问您怎么称呼? 大鸵鸟:原来是麻雀小弟呀!本鸟叫鸵鸟! 小麻雀:鸵鸟哥耶!小弟飞的累的不行!让兄弟在您雄伟的身躯上歇歇脚么? 大鸵鸟:不行!本鸟还走累了呢!那我咋办? 小麻雀:你飞呗!难道我还拖着你不成? 大鸵鸟:前提是我要是能飞的起...

weixin_33716557的博客 381

【法如faro】三维激光软件Scene2023数据处理(自动配准并转换坐标)流程

法如faro Scene2023数据处理(自动配准并转换坐标)的主要流程为:新建项目、导入数据、处理、自动注册、坐标系转换、模型导出立和面模型导出等。

智慧空间实验室 2382

设计一个扩展自抽象类geometricobject_面向对象基础设计原则:3.里氏替换原则

在Java中,支持抽象和多态的关键机制之一是继承。正是使用了继承,我们才可以创建实现父类中抽象方法的子类。那么,是什么规则在支配着这种特殊的继承用法呢?最佳的继承层次的特征又是什么呢?在什么情况下会使我们创建的类层次结构掉进不符合开闭原则的陷阱中呢?这就是里氏替换原则要解决的问题。里氏替换原则(The Liskov Substitution Principle,LSP)是由Barbara Lisk...

weixin_39761880的博客 542

【图像去噪】论文精读:Restormer: Efficient Transformer for High-Resolution Image Restoration

论文题目:Restormer: Efficient Transformer for High-Resolution Image Restoration —— Restormer:用于高分辨率图像恢复的高效变压器高效Transformer模型用于图像恢复!由于卷积神经网络 (CNN) 在从大规模数据中学习可泛化的图像先验方面表现良好,因此这些模型已广泛应用于图像恢复和相关任务。最近,另一类神经架构 Transformer 在自然语言和高级视觉任务中显示出显着的性能提升。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1523

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

一、什么是里氏替换原则 里氏替换原则的严格表达是:如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都替换成o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型。换言之,一个软件实体如果使用的是一个基类的话,那么一定适用于其子类,而且它根本不能察觉出基类对象和子类对象的区别。比如,假设有两个类,一个是Base类,另一个是Child类,并且

xingjiarong的专栏 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深入理解设计原则之里氏替换原则(LSP)【软件架构设计】

里氏替换原则(Liskov Substitution Principle, LSP)于1986年有Barbara Liskov提出,他当时是这样描述这条原则的:如果S是T的子类型,那么T的对象可以被S的对象所替换,并不影响代码的运行。1996年,Robert Martin在他的SOLID原则中重新描述了里氏替换原则:使用父类对象的函数可以在不了解子类的情况下替换为使用子类对象。 结合上面的描述,我们将里氏替换原则描述为:子类对象能够替换到程序中的父类对象出现的任何地方,并且保证程序原有的逻辑行为不变和正确性

weixin_30197685的博客 3441

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

Python:里氏替换原则(LSP)

Square 改变了父类 Rectangle 的关键行为契约(宽高修改的独立性),导致在需要 Rectangle 的场景中无法正确替换 Rectangle,从而违反了 LSP。里氏替换原则就像“标准插头规范”:任何子类都必须遵守父类定义的接口和行为规范,才能在父类能工作的场景中无缝替换使用。如果 S 是 T 的子类型,那么类型 T 的对象可以被类型 S 的对象替换,而不会改变程序的正确性。改进:创建 Writer 抽象基类;LSP 的意义就是确保继承结构的正确性,使子类是真正的父类扩展,而不是破坏父类。

qq_41176800的博客 1581

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

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

OpenSeek的博客 1988

面向对象程序设计原则——里氏替换原则(LSP)

里氏替换原则(Liskov Substitution Principle,LSP)是面向对象设计中的一个重要原则,由芭芭拉·利斯科夫(Barbara Liskov)在1987年的会议演讲中首次提出。这个原则后来成为著名的SOLID原则之一,SOLID是五个面向对象设计原则的首字母缩写。其核心思想是:如果一个程序中使用了一个基类的对象,那么一定可以使用其子类的对象来替换它,而不会影响程序的正确性。简而言之,子类应该可以完全替代父类,而不会导致程序出错或行为异常。

慢慢记录,慢慢更新。 1757

七大设计原则之里氏替换原则

里氏替换原则,英文叫LiskovSubstitutionPrinciple,简称LSP(老色皮,哈哈)。里氏替换原则,其实是没有我们前面,说的SRP和OCP比较见名知意一些。根据他们两个的中文名称,我们都很容易联想到他的定义。比如,单一职责原则,就是一个类或者模块只负责一个职责。而开闭原则,根据名字,我们也不难得知其定义就是,对扩展开发,对修改关闭。然而,里氏替换原则,根据名称,我们却难以得知其到底有何含义。里氏替换,其实重点就在后面的替换两字。

胜人者有力,自胜者强! 1823

设计原则—SOLID(LSP)

Liskov Substitution Principle,缩写为 LSP。这个原则最早是在 1986 年由 Barbara Liskov 提出 子类对象(object of subtype/derived class)能够替换程序(program)中父类对象(object of base/parent class)出现的任何地方,并且保证原来程序的逻辑行为(behavior)不变及正确性不被破坏。 里式替换原则还有另外一个更加能落地、更有指导意义的描述,那就是“Design By Contrac“

3万+

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

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

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

u013150151的专栏 1182

【设计模式】设计原则:LSP 里氏替换原则

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

A minor 404
上一篇: 面向对象的设计原则(2):OCP
下一篇: WebLogic8.1试用
Andy
博客等级 码龄26年 115粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值