liskov-substitution-principle相关内容

构造函数是否应该遵守 Liskov 替换原则?

我通常会尝试确保我的对象实例符合 Liskov Substitution Principle,但我一直想知道人们是否认为 LSP 也应该适用于构造函数? 我试过在谷歌上搜索这个,但无论如何我都找不到任何强烈的意见. 我应该注意到我的大部分编码都是用 Ruby 编写的,但我有时会发现我的子类构造函数与父类略有不同.它们采用相同的基本参数集,通常还有额外的参数.有时,其他类方法也会发生这种 ..

Collections.unmodifiableXXX 方法是否违反 LSP?

Liskov 替换原则是SOLID.我已经多次阅读这个原则并试图理解它. 这是我的总结, 这个原则与强行为契约有关类的层次结构.子类型应该能够替换为不违反合约的超类型. 我也阅读了其他一些文章,但我有点想不通了关于这个问题.Collections.unmodifiableXXX() 方法不违反 LSP 吗? 摘自上面链接的文章: 换句话说,当通过其基类接口使用对象时, ..
发布时间:2021-12-27 18:00:58 Java开发

你能用一个好的 C# 例子来解释 Liskov 替换原则吗?

你能用一个很好的 C# 示例来解释 Liskov 替换原则(SOLID 的“L"),以简化的方式涵盖该原则的所有方面吗?如果真的有可能. 解决方案 (此答案已于 2013-05-13 重写,请阅读评论底部的讨论) LSP 是关于遵循基类的契约. 例如,您不能在子类中抛出新的异常,因为使用基类的人不会想到这一点.如果基类抛出 ArgumentNullException 如果缺少参 ..
发布时间:2021-12-12 08:06:43 C#/.NET

从矩形导出正方形是否违反了 Liskov 的替换原则?

我是设计和学习设计原则的新手. 它说从矩形导出正方形是违反 Liskov 替换原则的典型例子. 如果是这样,正确的设计应该是什么? 解决方案 我相信推理是这样的: 假设您有一个接受矩形并调整其宽度的方法: public void SetWidth(Rectangle rect, int width){rect.Width = 宽度;} 考虑到矩形是什么,假设这个测试会 ..
发布时间:2021-12-11 23:52:25 其他开发

什么是 Liskov 替换原则的例子?

我听说 Liskov 替换原则 (LSP) 是面向对象设计的基本原则.它是什么以及它的使用示例有哪些? 解决方案 一个很好的例子说明了 LSP(由鲍勃叔叔在我最近听到的播客中给出)是有时在自然语言中听起来正确的东西在代码. 在数学中,Square 是 Rectangle.实际上,它是矩形的特化.“is a"使您想通过继承对其进行建模.但是,如果在代码中您使 Square 从 Rect ..

为什么数组实现 IList?

见System.Array类的定义 公共抽象类 Array : IList, ... 理论上,我应该能写出这点并且开心 int[] list = new int[] {};IList iList = (IList)list; 我也应该能够从 iList 调用任何方法 ilist.Add(1);//这里的异常 我的问题不是为什么会出现异常,而是为什么 Array 实现 IList? ..
发布时间:2021-11-18 01:23:26 C#/.NET

违反里氏替换原则

来自维基百科, Liskov 的行为子类型概念定义了对象的可替代性;也就是说,如果 S 是 T 的子类型,那么程序中类型 T 的对象可以替换为类型 S 的对象不改变该程序的任何理想属性(例如正确性). 假设以下类层次结构: 基础抽象类 - AnimalWithFur.它有一个只读属性 furColor,在后继者中被覆盖. 基类的继承者 - Cat,它覆盖了 furColor 并 ..
发布时间:2021-06-12 19:17:05 其他开发

如何考虑子类型的多态性

Liskov 替换原则指出: 超类型的不变量必须保留在子类型中. 我对这个原则和多态性的交叉点特别感兴趣.但实际上,特别是子类型多态性,参数多态性和 Haskell 类型类似乎就是这种情况. 所以,我知道当函数的参数是逆变的并且它们的返回类型是协变时,函数就是子类型.我们可以假设方法只是带有隐式“self"参数的函数.然而,这似乎意味着如果一个子类覆盖了父类的一个方法,它就不再是 ..

如何在 PHP 中的子类继承方法中定义更严格的类型?

假设我有三个这样的类. 抽象类 A {抽象受保护函数 doSomething($object): 数组;}B类扩展A{受保护的函数 doSomething(SomeObject $object): 数组{//某物}}C类扩展A{受保护的函数 doSomething(OtherObject $object): 数组{//某物}} 根据 PHP 的继承原则,上述结构不是合法的 PHP 代码,因为方 ..
发布时间:2021-06-12 19:11:08 PHP

Liskov替代原则也适用于实现接口的类吗?

1)LSP是否也适用于接口,这意味着我们应该能够使用实现特定接口的类并仍然获得预期的行为? 2)如果确实如此,那么为什么使用接口编程被认为是一件好事(顺便说一句,我知道对接口进行编程会增加松散耦合),如果使用继承的主要原因之一是由于违反LSP的风险?也许是因为: a)松耦合的好处超过了不遵守LSP的风险 b)与继承相比,类(实现接口)不遵守LSP的机会要小得多 谢谢 ..
发布时间:2021-04-30 19:26:59 其他开发

Liskov替代原理和PHP接口

以下代码是否直接违反了Liskov替换原则: 子类永远不能破坏父类的类型定义. class Baz {}Foo类扩展了Baz {}接口a{公共功能baz(Baz $ baz);}B类实现了一个{公共功能baz(Foo $ foo){}} 以下结果: 致命错误:b :: baz(Foo $ foo)的声明必须与a :: baz(Baz $ baz)兼容 解决方案 您的示例是非 ..
发布时间:2021-04-24 20:58:04 PHP

从GraphNode派生BinaryTreeNode违反了Liskov的替代原理

讨论在这里出现: 更改继承类中方法的可见性 问题是:"BTNode扩展GraphNode"设计真的违反了Liskov的Substitution Princeple吗?作为一个“类似"的例子,表明了这种情况: 从矩形派生正方形违反了Liskov的替换原理? 但是我真的看不出为什么这是相似的.我对设计非常陌生,有人可以向我解释为什么(如果这样)吗? 解决方案 在您不能从Graph ..
发布时间:2020-06-29 20:15:06 其他开发

这是对Liskov替代原理的正确理解吗

这是在采访中问我的. 我回答他说,对于相同的输入集,父母和孩子都应产生相同的输出集.如果孩子想扩展父母的功能,则只能对父母支持的范围以外的新输入进行操作.这样,孩子将维持其父母签订的合同. 我举了一个例子,一个api可能正在使用像这样的父母 if(parent.getOutput(10) == 5){/*do something */} 如果孩子在这里产生了不同的输出,则表明 ..
发布时间:2020-06-29 20:14:45 Java开发

复合图案是否牢固?

复合模式中的叶子实现了Component接口,包括叶子永远不会使用的Add,Remove和GetChild方法.这似乎违反了接口隔离原则. 复合模式的用法也是如此链接到复合模式: http://www.dofactory.com/Patterns/PatternComposite. aspx 解决方案 链接和大多数书籍中所描绘的图案中的真实气味是Component具有Composit ..

C#返回类型协方差和Liskov替换原理

我正在尝试了解协方差和LSP.从这个问题中,我可以看到C#不支持返回类型协方差.但是, Liskov替换原则对返回类型施加了协方差. 这是否意味着不可能在C#中应用此原理?还是我误会了什么? 解决方案 C#仍可以应用Liskov替换原理. 考虑: public class Base1 { } public class Derived1 : Base1 { } publ ..