问题标签 [liskov-substitution-principle]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 使用 C++ 继承来增强具有所有权语义的类
我有一些(在我看来)相当具体的所有权要求:我有一个基本上解释双精度数组的类是一种特定的方式(一些相当大的矩阵的串联),并且想与一个 C 库进行通信,然后在另一种方式(一个很长的数学向量)。在某些情况下,我想解释由 C 库传递给回调的指针,即不获取所有权。在这种情况下,复制将是非常不切实际的。在其他情况下,我想自己分配缓冲区,然后自己将其传递给 C 库。在这种情况下,我的代码拥有缓冲区。
我创建了一个“构建块”,将双数组解释为矩阵(使用boost::numeric::ublas::shallow_array_adaptor
,但这几乎无关紧要),如下所示:
复制和移动是被禁止的,这样实例就不会被意外地创建或移动到超出缓冲区本身寿命的地方。当然,可以通过直接将指针传递到某处来故意创建此类实例,但可以更容易地在源代码中发现。
我的问题的第一部分:让“通过缓冲区所有权增强”成为 的子类是否有意义?Foo
Foo
拥有- 的每一个操作Foo
都是可能的Foo
,另外,拥有-Foo
可以自由复制和移动。闻起来像是满足了 Liskov 替换原则。能够以相同的语法方式处理拥有Foo
,Foo
而无需在拥有中编写一堆方法,Foo
将委托给成员变量是非常舒服的。
另一方面,可能有 owner-of- Foo
,它只处理所有权而不是其他任何东西,并且包含一个Foo
可以从外部访问的实例,从而提供更好的关注点分离。
我实现了拥有 -Foo
像这样:
我的问题的第二部分:这是多重和私有继承的好案例吗?我在某处射自己的脚吗?
注意 ifFoo
不是成员,thanstd::unique_ptr
也不能是成员,因为它需要在之前 Foo
初始化。
scala - 为什么 HashMaps 不是 Semigroups,但 Maps 是?
为什么 HashMaps 不是 Semigroups,但 Maps 是?来自面向对象的背景,我原以为 HashMap 与 Map 一样强大?
autocad - 如何加载 .fas 文件并在 autocad2012 中的每个绘图加载时运行命令?
您好,我正在使用 Autocad2012,我正在尝试在 autocad 中加载一个简单的“XYZ.fas”文件,并希望在每次绘图加载时运行命令“XYZ”。我尝试在 Startup Suite 和 acaddoc.lsp 中添加 XYZ.fas,我编写了以下代码:
这样做只完成了一半的工作,只加载了 .fas 文件,但它不接受命令。但如果我手动编写命令,它运行顺利。我真的很难理解我错在哪里,任何帮助将不胜感激。谢谢
c# - 强制自动 ToString() 方法出现语法错误
默认情况下,在 c# 中,所有类都继承该ToString()
方法。我遇到的问题是,在工作中我们使用 将automapper
一些域对象映射到前端。我一直看到与以下 sudo 非常相似的代码。
问题是,虽然我希望从我被发送一个带有自动到字符串方法的类型来映射一个字符串。正确的代码应该类似于以下内容。
不幸的是,由于方法的自动继承,这ToString
两个都将编译和运行。虽然我可能会覆盖字符串以引发未实现的异常,但这不是一个好的设计并且会破坏 lsp,而且它仍然不会在编译时捕获错误,这会更理想。
任何想法我怎么可能执行此操作?
c# - Liskov 替换原理和 Streams
存在无法编写或查找的Stream派生类这一事实是否违反了 Liskov 替换原则?
例如,无法查找 NetworkStreamNotSupportedException
,如果调用该方法,它会抛出一个Seek
。
还是因为CanSeek
flag的存在就ok了?
Square
考虑到从...继承的众所周知的示例,Rectangle
是否会添加标志DoesHeightAffectsWidth
并DoesWidthAffectsHeight
解决Rectangle
问题?
这不是为通过添加标志来修复问题打开了大门吗?
oop - 任何人都可以提供使用车辆的 Liskov 替换原则(LSP)的示例吗?
Liskov 替换原则指出子类型应该可以替换该类型(不改变程序的正确性)。
- 有人可以在车辆(汽车)领域提供这个原则的例子吗?
- 有人可以提供一个在车辆领域违反这一原则的例子吗?
我已经阅读了方形/矩形示例,但我认为车辆示例将使我更好地理解这个概念。
java - 覆盖 getPreferredSize() 会破坏 LSP
例如,我总是在这个站点中看到覆盖getPreferredSize()
而不是使用setPreferredSize()
这些先前线程中所示的建议。
- 使用覆盖 getPreferredSize() 而不是 setPreferredSize() 用于固定大小的组件
- 我应该避免在 Java Swing 中使用 set(Preferred|Maximum|Minimum)Size 方法吗?
- 覆盖 setPreferredSize() 和 getPreferredSize()
看这个例子:
setPreferredSize()
- 设置此组件的首选大小。
getPreferredSize()
- 如果 preferredSize 已设置为非空值,则返回它。如果 UI 委托的 getPreferredSize 方法返回非 null 值,则返回该值;否则遵从组件的布局管理器。
所以这样做显然违反了里氏替换原则。
prefferedSize
是一个绑定属性,所以当你设置它时,它firePropertyChange
会被执行。所以我的问题是当你覆盖时getPrefferedSize()
你不需要覆盖setPreferredSize(..)
吗?
例子:
现在我们看到我们得到了相同的结果,但是侦听器将收到带有真实值的通知,此外我们不会破坏 LSP 原因setPreferredSize
状态Sets the preferred size of this component.
,但不会破坏如何。
oop - 了解 LSP
读完这篇文章后,我想我主要了解 LSP 和大多数示例,但我不能说我是 100% 确定从我对许多继承示例的经验来看,因为似乎很多示例确实违反了 LSP,而且似乎很难当覆盖行为时不要。
例如,考虑以下简单的继承演示,取自Head First Object Oriented Analysis & Design。他们是否违反了 Jet 子类的 LSP?
使用对基类 Airplane 实例的引用的客户端在设置速度后可能会惊讶地发现它在传递一个 Jet 对象的实例后是预期速度的两倍。Jet 是不是改变了 setSpeed() 方法的后置条件,从而违反了 LSP?
例如
如果 takeAirplane 传递了对 Jet 对象的引用,这显然会失败。在我看来,在“覆盖超类的行为”时很难不违反 LSP,但这是继承的主要/理想特性之一!
有人可以解释或帮助澄清这一点吗?我错过了什么吗?
java - Collections.unmodifiableXXX 方法是否违反 LSP?
Liskov Substitution 原则是SOLID的原则之一。我已经多次阅读这个原则并试图理解它。
这是我从中得到的,
该原则与类层次结构之间的强行为契约有关。子类型应该能够在不违反合同的情况下被超类型替换。
我也读过其他一些文章,我对这个问题有点迷茫。方法不Collections.unmodifiableXXX()
违反 LSP 吗?
摘自上面链接的文章:
换句话说,当通过它的基类接口使用一个对象时,用户只知道基类的前置条件和后置条件。因此,派生对象不能期望这些用户遵守比基类要求的更强大的先决条件
为什么我这么认为?
前
后
我不能改变实现SomeClass
以在将来返回不可修改的列表。编译将起作用,但是如果客户端以某种方式尝试更改List
返回的内容,那么它将在运行时失败。
这就是 Guava为集合创建单独的ImmutableXXX接口的原因吗?
这不是直接违反 LSP 还是我完全搞错了?