首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用著名的正方形/矩形示例破坏Liskov原理会产生一个逻辑错误

Liskov原则是面向对象设计中的一个重要原则,也称为LSP(Liskov Substitution Principle)。它是由计算机科学家Barbara Liskov提出的,用于指导子类在继承父类时的行为。

Liskov原则的核心思想是:子类对象应该能够替换父类对象并且不会影响程序的正确性。换句话说,子类应该能够完全替代父类,而不需要修改调用父类的代码。

如果在使用正方形/矩形示例时破坏了Liskov原则,会导致一个逻辑错误。正方形和矩形之间的关系是正方形是矩形的一种特殊情况,即正方形是矩形的子类。根据Liskov原则,子类对象应该能够替换父类对象,但是如果在正方形/矩形示例中,将正方形作为矩形的子类实现时,可能会出现问题。

正方形和矩形的区别在于,正方形的宽度和高度是相等的,而矩形的宽度和高度可以不相等。如果将正方形作为矩形的子类实现,那么在修改正方形的宽度或高度时,会导致矩形的宽度和高度也发生变化,从而违反了Liskov原则。

这个问题的解决方法是重新设计类的继承关系。可以将正方形和矩形都作为独立的类,并且它们都继承自一个共同的父类,例如形状(Shape)类。形状类可以定义共同的属性和方法,而正方形和矩形类则分别实现自己特有的属性和方法。

在云计算领域中,Liskov原则的应用不仅限于编程语言和面向对象设计,还可以应用于系统架构设计、微服务设计等方面。遵循Liskov原则可以提高系统的可扩展性、可维护性和可测试性。

腾讯云相关产品和产品介绍链接地址:

  • 云服务器(ECS):提供可扩展的计算能力,适用于各种应用场景。产品介绍链接
  • 云数据库MySQL版(CDB):提供高性能、可扩展的关系型数据库服务。产品介绍链接
  • 人工智能平台(AI Lab):提供丰富的人工智能开发工具和服务,支持图像识别、语音识别、自然语言处理等。产品介绍链接
  • 物联网套件(IoT Hub):提供全面的物联网解决方案,包括设备管理、数据采集、远程控制等功能。产品介绍链接
  • 云存储(COS):提供安全可靠的对象存储服务,适用于各种数据存储需求。产品介绍链接
  • 区块链服务(BCS):提供高性能、可扩展的区块链解决方案,支持智能合约开发和部署。产品介绍链接
  • 腾讯云元宇宙:腾讯云的元宇宙项目正在积极研发中,敬请期待。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

软件方法(下)第8章分析之分析类图—知识篇Part13-警惕拼凑泛化

很多书和文章中提到Liskov替换原则时,会以矩形正方形(有时会换成椭圆和圆)问题为例。 假设把正方形看作矩形子类,如图8-107。...如果正方形代替矩形,要么为了保持正方形约束,最终得到面积是5×5=25,要么两边自由变化,正方形就不再是正方形了。...如果独立描述矩形正方形所需属性,可以得到图8-108。 图8-108 建模矩形正方形属性 从图8-108可以得知,正方形属性比矩形还少一个,把正方形作为矩形子类是不合适。...反过来,矩形倒是更像正方形子类,复用边长,再加一个边长。...正方形、黄金分割矩形等没有增加新属性,只是要求A边长和B边长值符合某个约束,也就是说,正方形、黄金分割矩形是属性值组合中一个子集表征,这个就是状态。如图8-111。

30710

《架构整洁之道》第 9 章 LSP:里氏替换原则

均为原创,读架构整洁之道笔记。里氏替换原则:(LSP :Liskov Substitution Principle)。使用一个父类对象,替换成该父类对象子类对象后,该程序不会发生异常。...按照业务切换实现类,业务是可以正常进行,不会破坏程序正确性,不会发生异常。最关键是这两个实现类,可以直接替换掉License接口。这样就是符合LSP原则。...图片正方形/长方形问题以下设计中,正方形/长方形问题,是一个著名违反LSP设计案例。图片可以看到,User调用Rectangle为获得长方形面积,可设置宽高。...而正方形与长方形设置宽高逻辑并不一致,所以正方形错误继承了Rectangle。如果使用Square,来替换掉Rectangle,就会发现错误。看下面的例子。Rectangle r = ......所以这是一个违反LSP案例,正方形不该继承于或者说成为长方形子类型。

25630
  • 软件设计SOLID原则及示例

    - 目的:当需要对软件进行改动时,应当通过增加新代码来实现,而不是修改现有的代码,从而减少引入错误风险。 3....里氏替换原则(Liskov Substitution Principle, LSP) - 定义:子类必须能够替换其基类并保持软件正确性。...请注意,这些例子是为了演示目的而简化,实际项目可能会更复杂。 1. 单一职责原则 (SRP) 问题描述:一个类既负责处理用户登录逻辑,又负责记录日志。...开放封闭原则 (OCP) 问题描述:假设我们有一个形状绘制应用,最初只支持圆形和正方形绘制。...里氏替换原则 (LSP) 问题描述:假设有一个`Rectangle`类,其子类`Square`(正方形)改变了`setWidth`和`setHeight`行为以保持边长相等。

    12110

    面向对象代码风格(下)

    面向对象思想,针对结构化编程这些缺点,提出了著名“开-闭”原则。意思是代码应该对添加开放,对修改关闭。能做到这个原则,是需要代码结构上利用面向对象特性才能做到。...但实际上这种想法可能会是错误,正确设计应该是规则约束少为基类,规则约束多为子类。 最著名例子是矩形正方形。日常观念中,矩形是比较通用,而正方形是比较特殊图形。...所以我们很容易把矩形设计成基类,而正方形设计成继承矩形子类。...但是这就是一个错误设计,因为如果用户以矩形接口,去使用正方形实例对象,调用了设置长度、宽度方法时,其中一个设置可能就是无效,因为正方形不能接受不同长度和宽度。这很容易产生逻辑错误。...正确做法是把正方形作为基类,而矩形继承正方形类,这样“设置边长”方法也可用于矩形。 我们在设计类继承关系时,必须注意所谓“一般”和“特殊”真实含义。

    75140

    一文搞懂SOLID原则(javascript)

    一个类都应该只对某一类职责负责。 需求变更/升级,往往需要通过更改职责相关类来体现。如果一个类拥有多个职责,对于某一职责更改可能会破坏其他耦合职责,产生无法预期破坏。...LSP(Liskov Substitution Principle)-里氏替换原则 LSP(Liskov Substitution Principle)里氏替换原则。...举个经典示例来解释:从数学概念上,正方形属于长方形一种;代码实现上,我们可以 正方形 extends 长方形,在这种场景下,我们要确保对于正方形实现不能破坏原有长方形逻辑。...多个专用接口比一个通用接口好。一个类决不要实现不会用到接口。所以,实现多个特定接口比实现一个通用接口要好。 JavaScript 中没有接口,下述以 typescript 为例。...在传统应用架构中,低层次组件设计用于被高层次组件使用,以此构建一个复杂系统。

    29910

    谈谈 SOLID 原则

    这是一个非常简单例子。当您应用程序不断扩展并变得复杂时,您将看到,每次在整个应用程序中添加新动物时,都会在AnimalSound函数中使用if语句一遍又一遍地重复编写逻辑。...因为如果我们想给不同客户提供差异化折扣时,你将要不断地修改Discount类代码以添加新逻辑。 为了遵循开闭原则,我们将添加一个新类来继承Discount。...扩展就无需修改原本代码啦。 里氏替换原则 里氏替换原则(Liskov Substitution Principle):子类必须可以替代其父类。 该原理目的是确定子类可以无错误地占据其父类位置。...,ISquare仅处理正方形图形,IRectangle处理矩形图形。...当然,还有另一个设计是这样: 类(圆形,矩形正方形,三角形等)可以仅从IShape接口继承并实现其自己draw行为,如下所示。

    61400

    设计模式—–里氏替换原则

    违背 LSP 原则一个简单示例 一个非常明显地违背 LSP原则示例就是使用 RTTI(Run Time Type Identification)来根据对象类型选择函数执行。...既然这样,我们可能得出结论了,这个模型现在是自洽(self-consistent)和正确。但是,这个结论其实是错误一个自洽模型不一定对它所有用户都保持一致!...逻辑自洽性也要求构建理论过程中所有逻辑推理和数学演算正确无误。逻辑自洽性是一个理论能够成立必备条件。)...这个函数对 Rectangle 是可以工作,但是如果传递一个 Square 参数进去则会发生断言错误。...这些函数揭示了对 LSP 原则违背。此外,Square 从 Rectangle 衍生也破坏了这些函数,所以也违背了 OCP 原则。 有效性不是内在 这引出了一个非常重要结论。

    90330

    【愚公系列】2021年12月 面向对象设计原则(三)-里氏替换原则(Liskov Substitution Principle or LSP)

    文章目录 前言 一、里氏替换原则(Liskov Substitution Principle or LSP) 二、使用步骤 示例 总结 前言 常用面向对象设计原则有七个,这七大设计原则都是以可维护性和可复用性为基础...在代码中将基类对象转换成其子类对象,不应当产生任何错误或异常。...二、使用步骤 示例 namespace Liskov; public abstract class Shape { public abstract double Area(); public...里氏替换原则要求尽可能使用其基类作为方法参数,以下给出一个解决方案以供参考: public static void DoSomething(Shape shape) { var area...例如增加一个正方形子类Square,而不需要对DoSomething方法做任何改动。

    20010

    SOLID 原则保驾 React 组件开发

    ,这里想在库存为 0 时做出提示,但是逻辑和增减数字糅杂在了一起;如果想在项目中其他地方只想复用一个数字步进器,就要额外捎上很多其他不相关业务逻辑,这显然是不合理。...自己定义组件也应该谨记这一原则,比如在一个 里包裹 ,并通过修改 props 来实现扩展按钮颜色功能,而非直接找到 Button 源码并增加颜色逻辑。...另外,“单一职责”中两个例子也可以很好地解释“开放/封闭”原则,职责单一情况下,通过继承或包裹就可以扩展新功能;反之就还要回到模块源代码中修修补补,让局势更混乱。...,上面的代码就产生了歧义;并且关键在于,如果基于现有的 API(允许分别设置宽高)有一个 “设置宽2高5就能得到面积10” 假设,则正方形子类就无法实现该假设,而这样实现就是违背里氏替换原则不良实践...再举一个直观点例子就是:如果一个地方放置了一个 Modal 弹窗,且该弹窗右上角有一个可以关闭 [close] 按钮;那么无论以后在同样位置替换 Modal 子类或是 Modal 包裹组合出来组件

    81920

    面向对象设计五项基本原则

    一个事物抽象化,实质上是对一个事物进行概括、归纳、总结,将其本质特征抽象地一个类来表示,这样类才会相对稳定,无需更改。 所谓扩展开放,就是在不改变已存在前提下可以添加很多功能。...Liskov替换原则作用就是为了保证继承复用可靠。 下面来举个违反替换原则特殊例子: 正方形与长方形问题也是属于“圆不是椭圆”这类问题。...我们知道正方形一个特殊长方形,所以可以设计两个类,正方形类继承自长方形类。长方形类有两个成员变量,分别表示长和宽,有个计算面积成员函数。假如计算面积方法是virtual,这样能实现多态。...所以一个正方形类继承自长方形类设计是不好(注意一点是你违反了Liskov替换原则并不是说就写代码就会出错,只是说设计不太合理。...单一职责原则与接口分离都体现了内聚思想; (2)开放封闭原则,要求类不作修改而能够扩展功能,体现了类封装与继承; (3)Liskov替换原则,要求派生类要能够替换基类,是对类继承规范;

    96720

    写了这么多年代码,你真的了解SOLID吗?| 洞见

    利益相关者角色是一个重要变化原因,不同角色会有不同需求,从而产生不同变化原因。作为居民,家用电线是普通220V电线,而对电网建设者,使用是高压电线。...一个Wire类同时服务于两类角色,通常意味着坏味道。 变更频率是另一个值得考虑变化原因。即使对同一类角色,需求变更频率也会存在差异。...,最典型例子就是Bob大叔在《敏捷软件开发:原则、模式与实践》中讲到正方形继承矩形例子了。...从一般意义来看,正方形是一种矩形,但这种继承关系破坏了业务正确性。...如果r是一个正方形,则面积为16 } 代码中testArea方法参数如果是正方形,则面积是16,而不是期望20,所以结果显然不正确了。

    77110

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

    是动作正确性保证,即类扩展不会给已有系统引入新错误,降低了代码出错可能性 加强程序健壮性,同时变更时可以做到非常好兼容性,提高程序维护性、可扩展性,降低需求变更时引入风险。...---- Case 关于里氏替换场景,最有名就是“正方形不是长方形” , 当然了还有一些关于动物例子,比如鸵鸟、企鹅都是鸟,但是不会飞。...这样例子可以非常形象帮助我们理解里氏替换中关于两个类继承不能破坏原有特性含义。 这里我们个银行卡场景来描述一下: 储蓄卡、信用卡都可以消费,但信用卡不宜提现,否则产生高额利息。...此时继承父类实现信用卡类并不满足里氏替换原则。 也就是说,此时子类不能承担父类功能,直接给储蓄卡使用。...实现这样最好方式就是提取出一个抽象类 , 由抽象类定义所有卡共同核心属性、逻辑, 把卡支付和还款等动作抽象成正向和逆向操作。

    47230

    以对象为中心和MDL原则处理ARC挑战 2023

    一个任务模型M = (Mi, Mo)由一个输入网格模型Mi和一个输出网格模型Mo组成。图2显示了一个正确任务b94a9452模型,文字表述为:“输入网格中有两个堆叠完整矩形,背景为黑色。...这些泛化在ARC任务测试示例中并不是必需,但它们使模型能够在打破训练示例不变量输入网格上工作,例如,一个十字形在一个矩形上方,矩形一个蓝色背景上方。...在程序合成领域一项著名工作[13]导致了Microsoft Excel 2013一个新功能,称为FlashFill。...,输出字符串可以是天或年份最后两位数字;在任务11中,训练示例一个打字错误(故意),这使得任务未指定。...输出是这三个整数连接,破折号分隔,当输入中缺少第一个整数时,它是425。在FlashFill中,通常会产生大量程序,因为执行是穷举搜索。

    11110

    软件架构设计原则--里氏替换原则

    本专栏内容参考自:咕泡学院Tom老师《Spring5核心原理与30个类手写实战》,仅作个人学习记录使用,如有侵权,联系速删   里氏替换原则(Liskov Substitution Principle...可以理解为一个软件实体如果适用于一个父类,那么一定适用于其子类,所有引用父类地方必须能透明地使用其子类对象,子类对象能替换父类对象,而程序逻辑不变。   ...一个经典业务场景:正方形矩形、和四边形关系说明里氏替换原则,我们都知道正方形一个特殊长方形,所以可以创建一个父类Rectangle: public class Rectangle {...我们再来创建一个基于长方形和正方形共同抽象四边形接口Quadrangle: public interface Quadrangle { long getWidth(); long getHeight...Quadrangle,方法内部就会报错,因为正方形已经没有了设置宽高方法。

    31830

    SOLID之LSP

    里氏代换原则 LSP,Liskov Substitution Principle 子类型必须能够替换掉它们基类型 若对每个类型S对象O1,都存在一个类型T对象O2,使得在所有针对T编写程序P中,...O1替换O2后,程序P行为功能不变,则S是T子类型 LSP是继承关系设计基本原则,也是使OCP成为可能主要原则之一。...同样假设B某个派生类D,如果把D对象作为B类型传递给f,会导致f出现错误行为。那么D就违反了LSP。显然,D对于f来说是脆弱。...IS-A关系,那么这个新对象类应该从这个已用对象类派生 从一般意义上讲,一个正方形就是一个矩形。...因此,把Sequare类视为从Rectangle类派生是合乎逻辑 void f(Rectangle r) { r.setWidth(5); r.setHeight(4); assert

    66930

    为什么一个类不能随意被继承?

    今天我们来聊聊S.O.L.I.D原则中L:Liskov Substitution Principle(LSP),里氏替换原则。...里氏替换原则(Liskov Substitution Principle,LSP)可以解释为: 派生类型(子类)必须能够替换掉它们基类型(父类)。...从语法上来说,怎么 extends 关键字来实现父子类关系都可以!但从业务逻辑上看,这是有很大问题。比如下面这个例子。 LSP 反证示例 我们有个 Dog 类。...同样,网络上经典例子:正方形不是长方形子类,也是如此。 大多数小伙伴觉得正方形可以继承长方形,是因为把长和宽设置为一样就成正方形了。代码语法层面上很好实现。...问题在于,如果一个程序需要长方形进行面积计算时,你正方形来替代,计算出结果就和预期不符了。

    19620

    软件架构设计原则之里氏替换原则

    里氏替换原则(Liskov Substitution Principle,LSP)是指如果对每一个类型为T1对象o1,都有类型为T2对象O2,使得以T1定义所有程序P在所有的对象O1都替换成O2时...可以理解为一个软件实体如果适用于一个父类,那么一定适用于其子类,所有引用父类地方必须能透明地使用其子类对象,子类对象能够替换父类对象,而程序逻辑不变。...在讲开闭原则时候我埋下了一个伏笔,在获取折扣时重写覆盖了父类getPrice()方法,增加了一个获取源码方法getOriginPrice(),显然就违背了里氏替换原则。...现在来描述一个经典业务场景,正方形矩形和四边形关系说明里氏替换原则,我们都知道正方形一个特殊长方形,所以就可以创建一个父类Rectangle: public class Rectangle...我们再来创建一个基于长方形与正方形共同抽象四边形接口Quadrangle: public interface Quadrangle { long getWidth(); long

    43220

    软件方法(下)分析和设计第8章分析 之 分析类图——知识篇(20211227更新)

    很多书和文章中提到Liskov替换原则时,会以矩形正方形(有时会换成椭圆和圆)问题为例。 假设把正方形看作矩形子类,如图8-90。...如果正方形代替矩形,要么为了保持正方形约束,最终得到面积是5×5=25,要么两边自由变化,正方形就不再是正方形了。...图8-91 建模矩形正方形属性 从图8-91可以得知,正方形属性比矩形还少一个,把正方形作为矩形子类是不合适。 反过来,矩形倒是更像正方形子类,复用边长,再加一个边长。...也可以把A边长和B边长属性保留在矩形中,正方形、黄金分割矩形如果适用特殊规则,可以作为矩形状态。...正方形、黄金分割矩形等没有增加新属性,只是要求A边长和B边长值符合某个约束,也就是说,正方形、黄金分割矩形是属性值组合中一个子集表征,这个就是状态。如图8-94。

    91650

    C++ 继承与组合区别

    比如在OO界中著名“鸵鸟不是鸟”和“圆不是椭圆”问题。这样问题说明了程序设计和现实世界存在逻辑差异。...类继承允许我们根据自己实现来覆盖重写父类实现细节,父类实现对于子类是可见,所以我们一般称之为白盒复用。继承易于修改或扩展那些被复用实现,但它这种白盒复用却容易破坏封装性。...所以我们要经起“继承”诱惑,避免犯下设计错误。...而缺点就是致使系统中对象过多。 综上所述,Is-A关系继承表示,Has-A关系组合表示,GoF在《设计模式》中指出OO设计一大原则就是:优先使用对象组合,而不是类继承。...而在椭圆和圆问题上,椭圆类中成员函数setSize(x,y)违背了这个可置换性,即Liskov替换原则。 所有不良继承都可以归结为“圆不是椭圆”这一著名具有代表性问题上。

    57310

    记一次从魔术到数学非典型奇幻之旅

    在着迷于魔术效果同时,我思绪已经飞到了逻辑另一侧:任何两张牌都能完美遮挡一个和他一样大牌吗?是不是对牌长宽比有一些要求?...裁剪了两张(卫生)纸,撕成长条状,试了又试,发现正方形显然做不到这一点,而长边:短边 < 2时候,直接把两个矩形沿长边拼起来,再把待覆盖矩形垂直过来摆放,这显然就是一个可行解了。...几何世界真是奇妙! 数学语言描述一下上述问题: 两个一样大矩形,满足什么条件时候,能安全覆盖住一个和它一样大矩形?(安全覆盖:被盖住矩形往任何方向移动一个小量,都不影响覆盖成立。...例如,完全重合两个图形不算安全覆盖。) 答案是:其边长比不等于1,即是一个正方形时。下面证明之。...易知C每个点都至少被Ri中一个覆盖且有余量,此时命题要求完整覆盖也成立。

    35620
    领券