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

可能是最好的设计模式入门教程——里氏替换原则

里氏替换原则Liskov Substitution Principle,LSP)是面向对象设计(OOD)中比较重要、常见的一种,下面来总结里氏替换原则的知识点,包括: 维基百科定义 在面向对象的程序设计中...,里氏替换原则Liskov Substitution principle)是对子类型的特别定义。...在里氏代换原则中,实际上也使用了多态机制,子类对象在覆盖父类对象时,通过多态即可覆盖父类的行为。...Liskov替换原则,主要着眼于对抽象和多态建立在继承的基础上,因此只有遵循了Liskov替换原则,才能保证继承复用是可靠地。...Liskov替换原则是关于继承机制的设计原则,违反了Liskov替换原则就必然导致违反开放封闭原则

1.4K31

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

定义 里氏替换原则(Liskov Substitution Principle) 是由 Barbara Liskov 在 1987 年提出来的,Liskov 是她的姓,国内翻译成 里氏。...从契约角度来看,里氏替换原则有4层含义: 方法的前置条件要求不能更严格(可以更宽松) 方法的后置条件不能更宽松(可以更严格) 子类要保持父类约定的不变性 历史约束。...在以前写的一篇里氏替换原则 的文章里,我提到过: 每个类都会有public方法,有些类会实现interface,供其他类使用,自身就处在一个服务的位置上。...每个public方法都是自身所做出的一个承诺,只要你按照要求调用,就会提供正确的服务。...注意,这里已经违反了 LSP 原则,在基类中并没有异常抛出,使用方正常使用,而在 Penguin 类中 fly 方法抛出了异常,违反了基类遵守的契约。

1.2K40
您找到你想要的搜索结果了吗?
是的
没有找到

SOLID之LSP

里氏代换原则 LSP,Liskov Substitution Principle 子类型必须能够替换掉它们的基类型 若对每个类型S的对象O1,存在一个类型T的对象O2,使得在所有针对T编写的程序P中,...用O1替换O2后,程序P行为功能不变,则S是T的子类型 LSP是继承关系设计基本原则,也是使OCP成为可能的主要原则之一。...那么D就违反了LSP。显然,D对于f来说是脆弱的。 f的编写者会想去对D进行一些测试,以便于在把D的对象传递给f时,可以使f具有正确的行为。...基类的用户不应该被派生类的输出扰乱 简单判断就是“可替换性”,子类是否能替换父类并保持原有行为不变 LSP与架构 LSP从诞生开始,也就差不多这些内容,主要是指导如何使用继承关系的一种方法。...随着时间推移,在更宏观上,LSP逐渐演变成了一种更广泛的、指导接口与其实现方式的设计原则 可以是java风格的接口,具有多个实现类:甚至可以是几个服务响应同一个rest接口,用户依赖于一种接口,并且期待实现接口的类之间能具有可替换

65730

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

3.里氏替换原则Liskov Substituion Principle,LSP) Liskov替换原则指的是:子类可以替换父类并出现在父类能够出现的任何地方。...C++语言机制将类的抽象与多态建立在继承的基础上,其实现的方法是面向接口编程:通过提取纯虚类(Abstract Class),将公共部分抽象为基类接口或由子类重写覆盖基类方法来达到多态的目的。...Liskov替换原则的作用就是为了保证继承复用的可靠。 下面来举个违反替换原则的特殊例子: 正方形与长方形的问题也是属于“圆不是椭圆”这类问题。...所以一个正方形类继承自长方形类的设计是不好的(注意的一点是你违反了Liskov替换原则并不是说就写的代码就会出错,只是说设计不太合理。...单一职责原则与接口分离原体现了内聚的思想; (2)开放封闭原则,要求类不作修改而能够扩展功能,体现了类的封装与继承; (3)Liskov替换原则,要求派生类要能够替换基类,是对类继承的规范;

94520

【译】浅谈SOLID原则

并不是说每个只能有一个方法,但它们都应该与类的责任有直接关系。所有的方法和属性都应该努力做好同一类事情。当一个类具有多个目标或职责时,就应该创建一个新的类出来。...这就破坏了开闭原则。根据这个原则,我们不能修改原有代码,但是我们可以进行扩展。 所以我们可以把计算面积的方法放到Shape类中,再由每个继承它的子类自己去实现自己的计算方法。...里氏替换原则 里氏替换原则是由Barbara Liskov在1987年的“数据抽象“大会上提出的。...下面这段代码就违反了里氏替换原则: <?php interface LessonRepositoryInterface { /** * Fetch all records....我理解的里氏替换原则是:子类可以扩展父类的功能,但不能修改父类方法。因此里氏替换原则可以说是开闭原则的一种实现。

48820

遵循SOLID原则:构建高内聚低耦合的代码

这违反了开放封闭原则。我们应该让每个形状类自己计算面积,AreaCalculator类只负责调用这个方法。...里氏替换原则Liskov Substitution Principle, LSP) 子类型必须能够替换它们的基类型。这意味着如果一个类的子类不能替换它的父类,那么可能会导致代码的混乱。...Bird类有一个fly方法,但是Penguin类不能飞。这违反了里氏替换原则。我们应该将Bird类拆分为Bird类和FlyingBird类,Penguin类只继承Bird类。...例如,我们有一个Machine接口,它有print、fax、scan等方法。但是OldFashionedPrinter类只需要print方法,它不需要fax和scan方法。这违反了接口隔离原则。...总结 遵循SOLID原则可以帮助我们设计出高内聚、低耦合的代码: 高内聚:通过单一职责原则和接口隔离原则,我们可以保证每个类或模块只做一件事情,且做好一件事情,从而提高内聚性。

1500

软件工程设计原理里氏替换原则举例

里氏替换原则Liskov Substitution Principle, LSP)是面向对象设计的基本原则之一,由Barbara Liskov提出。...这个原则强调了继承关系中的行为兼容性,保证了基类和派生类之间的正确抽象和继承关系。具体实现实现里氏替换原则的关键是确保子类的行为满足父类的行为契约。子类可以扩展父类的功能,但不应改变父类原有的功能。...setHeight(int height) { super.setWidth(height); super.setHeight(height); }}在这个例子中,Square 类违反了里氏替换原则...遵守里氏替换原则的代码:为了遵守LSP,应该重新设计类的结构,确保正方形和矩形之间的行为一致性。...促进模块间的松耦合:通过确保子类的替换不影响程序的正确性,可以更灵活地在不同模块间重用类。遵循里氏替换原则有助于构建健壯且灵活的面向对象系统,确保了继承机制的正确使用和实现。

10810

Java 基础概念·面向对象基本特征与原则

里氏替换原则 里氏替换原则Liskov-Substitution Principle),其核心思想是:子类必须能够替换其基类。...Liskov 替换原则,主要着眼于对抽象和多态建立在继承的基础上,因此只有遵循了 Liskov 替换原则,才能保证继承复用是可靠地。...Liskov 替换原则是关于继承机制的设计原则,违反了 Liskov 替换原则就必然导致违反开放封闭原则。...Liskov 替换原则能够保证系统具有良好的拓展性,同时实现基于多态的抽象机制,能够减少代码冗余,避免运行期的类型判别。...具体而言就是高层模块不依赖于底层模块,二者同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。 我们知道,依赖一定会存在于类与类、模块与模块之间。

41950

java里式替换

里氏替换原则Liskov Substitution Principle,LSP)是面向对象编程中的一个基本原则,它指出如果一个类型 A 是另一个类型 B 的子类型,那么在使用类型 B 的代码中,可以用类型...里氏替换原则的定义里氏替换原则是由 Barbara Liskov 在 1987 年提出的,它的定义如下:“如果对于每一个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2,使得以 T1 定义的所有程序...里氏替换原则的实现在 Java 中,实现里氏替换原则需要遵循以下几个规则:2.1 子类必须完全实现父类的抽象方法如果一个父类中定义了抽象方法,那么子类必须实现这些抽象方法,并且保证实现的方法与父类的方法签名完全一致...Cat 类继承自 Animal 类,重写了 eat 方法,返回类型是 String。这个示例违反了里氏替换原则,因为 Cat 类的行为与 Animal 类不一致。...总结里氏替换原则是面向对象编程的重要原则之一,它能够有效提高代码的可维护性、可扩展性和可复用性。在 Java 编程中,遵循里氏替换原则需要注意以下几点:子类必须完全实现父类的抽象方法

1.3K40

基于 TypeScript 理解程序设计的 SOLID 原则

说到 SOLID 原则,可能写过代码的同学们应该听过吧,这是程序设计领域最常用到的设计原则。...:单一职责原则 Open Closed Principle:开闭原则 Liskov Substitution Principle:里氏替换原则 Interface Segregation Principle...,我们只需要添加一个名为 Shape 的接口,每个形状类(矩形、圆形等)都可以通过实现它来依赖接口。...简单理解就是所有父类能出现的地方,子类就可以出现,并且替换了也不会出现任何错误。 我们必须要求子类的所有相同方法,都必须遵循父类的约定,否则当父类替换为子类时就会出错。..._height = height; } } 遵循里氏替换原则,我们不需要覆盖基类的属性,而是直接删除掉 Square 类并,将它的逻辑带到 Rectangle 类,而且也不改变其用途。

49120

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

概述        里氏替换原则(LSP,Liskov Substitution Principle)是关于继承机制的原则,是实现开放封闭原则的具体规范,违反了里氏替换原则必然违反了开放封闭原则...在继承关系中,子类对父类的继承除了字段、属性,还有方法,而使同一方法在子类中表现出不同的行为是通过多态表现的,具体在语言上的操作上表现为父类提供虚函数,而在子类中覆写虚函数,这是抽象机制的重要基础。...,这正是里氏替换原则强调的继承关系,代码如下: class Fatherclass { //父类行为 public virtual void Method()...void Method() { } } (上面这个问题的回答参考《你必须知道的.NET》) ★子类可以有自己的“个性” 采用里氏替换原则时,...结论 实现开闭原则的关键步骤是抽象化,父类与子类之间的继承关系就是抽象化的体现,因此里氏替换原则是实现开闭原则的具体步骤规范,违反里氏替换原则一定违反开闭原则,反之未必。

2.7K21

漫谈模式之违反S.O.L.I.D设计原则的示例

里氏替换原则意图里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。里氏代换原 则中说,任何基类可以出现的地方,子类一定可以出现。...符合LSP原则的示例在这个示例中,Shape类是一个通用的形状类,Rectangle类和Square类继承自Shape类,并且实现了各自的getArea方法。...接口隔离原则意图每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。...然而,Dog并不能飞,因此它的fly方法只是抛出了一个不支持的操作异常。在这种情况下,我们违反了ISP原则,因为Animal接口强制实现所有的方法,包括不适用于某些实现类的方法。...这个设计符合ISP原则,因为每个接口只包含所需的方法,没有多余的方法。这样,我们可以根据需要选择实现哪个接口,而不需要实现不需要的方法。同时,我们也避免了实现不适用于某些实现类的方法

67960

《你必须知道的.NET》读书笔记二:小OO有大原则

此篇已收录至《你必须知道的.Net》读书笔记目录贴,点击访问目录可以获取更多内容。...替换原则和合成/聚合复用原则为OCP实现提供保证;     ②可以通过Template Method和Strategy模式进行重构;     ③封装变化是实现OCP的重要手段; 三、依赖倒置原则   (...替换原则   (1)核心思想:子类必须能够替换其基类 (2)DEMO:父类提供虚函数,子类覆写虚函数 class FatherClass { public virtual...(SonClass)f2 : null; son2.Method(); } } (3)规则建议:     ①违反了Liskov替换原则必然导致违反开放封闭原则...;     ②Liskov替换能够保证系统具有良好的扩展性;     ③子类的异常必须控制在父类可以预计的范围,否则将导致替换违规; 本章思维导图 ?

31340

PHP面向对象五大原则之里氏替换原则(LSP)详解

本文实例讲述了PHP面向对象五大原则之里氏替换原则(LSP)。...分享给大家供大家参考,具体如下: 替换原则由MIT计算机科学实验室的Liskov女士在1987年的OOPSLA大会上的一篇文章中提出,主要阐述有关继承的一些原则,故称里氏替换原则。...怎么样避免所设计的类层次陷入不符合OCP原则的状况? 那如何遵守设计原则呢?...如果A、B两个类违反了LSP的设计,通常的做法是创建一个新的抽象类C,作为两个具体类的超类,奖A和B的共同行为移动到C中,从而解决A和B的行为不完全一致的问题。...不过PHP对LSP的支持并不好,缺乏向上转型等概念,只能通过一些曲折的方法实现。对于这个原则,这里就不细讲了。 下面给出一个缓存的实现接口,用抽象类做基类,遵循LSP实现其设计。 <?

61930

Python 工匠:写好面向对象代码的原则(中)

L:里氏替换原则 同前面的 S 与 O 两个原则的命名方式不同,里氏替换原则Liskov Substitution Principle)是直接用它的发明者 Barbara Liskov 命名的,原文看起来像一个复杂的数学公式...但不幸的是,这段代码违反了“里氏替换原则”。具体是怎么回事呢?让我们来看看。 不当继承关系如何违反 L 原则 现在,假设我们需要写一个新函数,它可以同时接受多个用户对象作为参数,批量将它们停用。...到这里你会发现,SOLID 里的每条原则并非完全独立的个体,它们之间其实互有联系。比如,在这个例子里,我们先是违反了“里氏替换原则”,然后我们使用了错误的修复方式:增加类型判断。...所以我们可以说,修改后的类继承结构是符合里氏替换原则的。 另一种违反方式:子类修改方法返回值 除了上面的例子外,还有一种常见的违反里氏替换原则的情况。...所以,对于新的 get_user_posts_count 函数来说,现在的用户类继承结构仍然违反了 L 原则

98910

里式替换原则——面向对象程序设计原则

原则称为Liskov Substitution Principle——里氏替换原则。...里氏替换原则主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中蕴含的原理。...里氏替换原是继承复用的基础,它反映了基类与子类之间的关系,是对开闭原则的补充,是对实现抽象化的具体步骤的规范。 意义 防止重写父类方法,出现父类复用性差的情况。...因为子类重写了父类方法,在使用多态特性时,程序可能会出现不可预知的错误。 做法 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。 子类中可以增加自己特有的方法。...我们在杰斯类中覆盖了父类的方法,导致调用getrDPS()方法出现了意料之外的错误。

48310

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

一、里氏替换原则(Liskov Substitution Principle or LSP)里氏替换原则(Liskov Substitution Principle or LSP)是面向对象设计中的一个基本原则...里氏替换原则要求尽可能的使用其基类作为方法的参数,以下给出一个解决方案以供参考:public static void DoSomething(Shape shape) { var area = shape.Area...I'm a(n) Liskov.Circle!里氏替换原则根据“运行时子类对象覆盖父类对象”的特点,可以很方便的对系统进行扩展,只需要增加子类而无需更改任何现有代码。...1.子类必须完全实现父类的方法2.子类可以有自己的个性:从里氏替换原则来看,就是有子类出现的地方父类未必就可以出现。...3.覆盖或实现父类的方法时输入参数可以被放大覆写或实现父类的方法时输出结果可以被缩小在项目中,采用里氏替换原则时,尽量避免子类的“个性”,一旦子类有“个性”,这个子 类和父类之间的关系就很难调和了,把子类当做父类使用

21821

轻松学习设计模式之面向对象的设计原则

里氏替代原则Liskov Substitution Principle 里氏替换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话...使用里氏替换原则时需要注意,子类的所有方法必须在父类中声明,或子类必须实现父类中声明的所有方法。...,鲸鱼在水里开始呼吸,这时问题就出现了,鲸鱼是哺乳动物,在水里呼吸是没法呼吸的,一直在水里就GG思密达了,所以这违反了原则,我们就可以判断鲸鱼继承于鱼类不合理,需要去重新设计。   ...为了确保原则的应用,一个具体类应当只实现接口或抽象类中声明过的方法,而不要给出多余的方法,否则将无法调用到在子类中增加的新方法。...这些方法在定义时使用的是抽象类型,在运行时再传入具体类型的对象,由子类对象来覆盖父类对象。

45130
领券