lsp相关内容

重写getPreferredSize()会破坏LSP

我总是在此网站中看到覆盖 getPreferredSize()的建议,而不是使用 setPreferredSize(),如下所示例如,这些先前的线程。 使用重写getPreferredSize()而不是使用setPreferredSize()用于固定大小的组件 我应该避免使用set(Preferred | Maximum | Minimum )Java Swing中的大小方法? 重写se ..
发布时间:2019-01-02 13:56:04 Java开发

如何避免破坏Liskov替换原则(LSP)?

我的情况与Code Complete中提到的 Steve McConnell 非常相似。只有我的问题是基于车辆和三轮车才恰好依据法律属于汽车类别。到目前为止,汽车有四个轮子。任何方式我的域都是不必要的复杂,所以很容易坚持下面的猫示例。 要怀疑覆盖例程的类并且做 里面没有任何内容派生例程这通常表示基类的 设计中的错误。例如,假设您有一个类Cat和一个 例程Scratch()并假设您最终发 ..
发布时间:2018-12-10 21:42:56 Java开发

C#接口实现关系只是“Can-Do”。关系?

今天有人告诉我,C#中的接口实现只是“Can-Do”关系,而不是“Is-A”关系。这与我长期相信LSP(Liskov Substitution Principle)相冲突。我一直认为所有的继承应该意味着“Is-A”的关系。 所以,如果接口实现只是一个“可以做”的关系。如果有一个界面“IHuman”和“IEngineer”,并且一个类“Programmer”继承自“IHuman”& “IEng ..
发布时间:2018-08-03 16:29:25 C#/.NET

在Swift中使用枚举与相关值是否违反了Liskov替代原则?

enum WeatherType { case cloudy(coverage:Int) case sunny case windy } 我刚刚在Swift教程中看到这一点,我不敢相信他们允许你这样做。现在,每当我启用该枚举时,我必须为多个创建一个特殊情况。 解决方案 你不会“做任何事情”。如果你不在乎覆盖面是什么,不要问什么是覆盖面。如果你不在乎多云,不要问 ..
发布时间:2017-08-24 00:14:45 移动开发

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

LSP表示类可以替代它们的基类,这意味着派生类和基类在语义上是等价的。 但是,LSP也适用于实现接口?换句话说,如果一个类实现的接口方法在语义上与用户期望的不同,那么这被认为是违反LSP的? 谢谢 解决方案 否 适用于亚型。有关简要摘要,请参阅维基百科文章。 如果您有继承或扩展 A类的类B ,则应该可以切换 class A with class B ,一切都应该正常 ..
发布时间:2017-05-16 19:26:31 软件设计

从具体类继承的好例子?

背景: 作为Java程序员,我从接口广泛继承(而不是实现),有时我设计抽象基类。然而,我从来没有真正感觉到需要对一个具体的(非抽象的)类进行子类化(在这样的情况下,它再次证明了另一个解决方案,比如将会更好)。 所以现在我开始觉得几乎没有任何继承的情况从一个具体的班级是适当的。一方面, Liskov替代原则(LSP)似乎几乎不可能满足非平凡类;另外许多其他 所以我的问题: 在 ..
发布时间:2017-05-12 19:44:14 Java开发

做Collections.unmodifiableXXX方法违反了LSP?

Liskov替代原则是 SOLID 。现在我已经读了这个原则了一些次,并试图理解它。 这是我所做的, 这个原则是相关的在 级别的类之间强烈的行为契约。子类型应该能够被 超类替换,而不违反合同。 我已经阅读了其他一些文章,我有点迷惑了这个问题。 Do Collections.unmodifiableXXX()方法不违反LSP? 上面链接的文章摘录: 换句话说,当通过 ..
发布时间:2017-05-12 18:34:20 Java开发

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

我是设计和学习设计原则的新手。 它表示从矩形获取矩形是违反Liskov替代原则的典型例子。 如果是这样,应该是正确的设计? 解决方案 我相信推理是这样的: 假设你有一个接受矩形并调整其宽度的方法: public void SetWidth(Rectangle rect,int width) { rect.Width = width; } 应 ..
发布时间:2017-05-12 18:12:45 软件设计

Do Collections.unmodifiableXXX方法是否违反LSP?

Liskov替换原则是 SOLID 。我已经读了这个原则一些次,现在已经尝试了解它。 这是我所做的, 到 类层次中的强行为契约。 我已经读过一些其他文章,我有点失去思考这个问题。 上面链接的文章摘录: > 换句话说,当通过其基类接口使用对象 时,用户只知道基本的前提条件和后置条件 类。因此,派生对象不能期望这样的用户服从比基类所要求的更强的 前提条件 为 ..
发布时间:2016-12-15 18:24:16 Java开发

违反层次里氏 - 那又怎么样呢?

我使用违反了里氏替换原则的API:它抛出一个扩展异常了自己的异常类型,但在一个新的错误码现场把异常消息从基类,并在消息把自己的(无用)消息领域。因此,以显示正确的消息,我需要异常转换为DerivedException类型和使用错误码字段。如果我把它当作一个Exception对象,我得到了错误的信息。 现在这惹恼了我对文体的水平,但它是很容易得到解决:我可以赶上DerivedException ..
发布时间:2016-10-04 22:43:49 C#/.NET

ReadOnlyCollection还VS里氏 - 如何正确模拟可变集合不可改变的交涉

里氏替代原则要求亚型必须满足超类型的合同。在我的理解,这将意味着该 ReadOnlyCollection还< T> 里氏违反。 的ICollection< T> 的合同自曝添加和删除操作,但只读亚型不满足该合同。例如, 的IList<对象>收集=新的List<对象>(); 收集=新System.Collections.ObjectModel.ReadOn ..

里氏替换原则和流

是否事实,有的流的,不能书面或寻求打破了里氏替换原则派生类 例如,的的NetworkStream 不能被追捧,它会抛出一个引发NotSupportedException 如果方法寻找 还是因为>被调用。 CanSeek 标记的存在,这是确定? 考虑众所周知的例子广场从长方形 ...会增加标志的 DoesHeightAffectsWidth 和 DoesWidthAffectsHe ..
发布时间:2016-09-26 21:28:09 C#/.NET

这是否违反了里氏替换原则,如果是这样,我该怎么办呢?

使用情况:我使用的数据模板匹配查看到一个ViewModel。通过检查最派生类型的具体类型的数据模板提供的工作,他们不看什么接口提供,所以我必须这样做没有接口。 我在这里简化的例子,离开了NotifyPropertyChanged等,但在现实世界中,视图是要绑定到Text属性。为简单起见,假设有一个TextBlock视图将绑定到ReadOnlyText和一个文本框会绑定到WritableTex ..
发布时间:2016-09-26 13:01:52 C#/.NET

为什么数组实现IList?

请参阅定义的的System.Array 的类 公共抽象类数组:IList的,... 从理论上讲,我应该能够编写此位和快乐 INT []列表=新INT [] {}; IList的IList的=(IList的)名单; 我也应该能够从IList中调用任何方法 ilist.Add(1); //这里异常 我的问题是不是为什么我得到一个异常,而是为什么数组实现IList 解决方案 由于数 ..
发布时间:2016-05-30 21:13:49 C#/.NET

我可以实现一系列的可重复使用的测试来测试接口的实现?

我写了一系列在C#集合类,每个实施类似的自定义接口。是否可以编写一个集合的单元测试的接口,并自动在几个不同的实现运行它们呢?我想,以避免任何重复测试code每个实现。 我愿意考虑任何框架(NUnit的等)或Visual Studio扩展做到这一点。 对于那些希望做同样的,我贴我的具体的解决方案,基于关 avandeursen的接受的解决方案,因为答案。 解决方案 是的,这是可能的。诀窍就是 ..
发布时间:2015-11-26 00:57:35 C#/.NET

Liskov的字符串替换和组成

让说,我有一类这样的: 公共密封类Foo { 公共无效酒吧 { //待办事项栏的东西 } } 和我想扩展它添加的东西超出了一个扩展方法可以做到....我唯一的选择是组成: 公共类SuperFoo { 私人富_internalFoo; 公共SuperFoo() { _internalFoo =新的Foo(); ..
发布时间:2015-11-24 21:08:48 C#/.NET

你能解释一下里氏替换原则有很好的C#示例?

你能解释里氏替换原则(固态'L')与覆盖在一个简化的方式的原则的所有方面一个很好的C#示例?如果真的是可能的。 解决方案 (这个答案已经被改写2013年5月13日,阅读评论底部的讨论)的 LSP是关于以下的基类的合同。 您可以如不能扔在子类作为一个使用基类不会想到,新的异常。也是一样的,如果基类抛出 ArgumentNullException 如果一个参数丢失和子类允许参数为空,也是一个L ..
发布时间:2015-11-24 14:12:24 C#/.NET