问题标签 [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.

0 投票
6 回答
9127 浏览

design-principles - Liskov 替换原则 - 没有覆盖/虚拟方法?

我对 Liskov 替换原则的理解是,基类的某些属性是真的,或者基类的某些实现的行为,对于派生类也应该是真的。

我想这意味着当一个方法在基类中定义时,它不应该在派生类中被覆盖——因为这样替换基类而不是派生类会产生不同的结果。我想这也意味着,拥有(非纯)虚拟方法是一件坏事?

我想我可能对原理有错误的理解。如果我不这样做,我不明白为什么这个原则是好的做法。谁可以给我解释一下这个?谢谢

0 投票
5 回答
2228 浏览

oop - Liskov 替换原则是否适用于从抽象类继承的子类型?

松散地说,里氏替换原则指出派生类可以替代基类而不影响用户。如果基类是抽象类,即没有用户使用基类的实例,那么 Liskov 继承限制是否仍然适用于派生类?

0 投票
4 回答
206 浏览

oop - 类型 - 子类型关系。有些东西似乎不清楚

我正在阅读有关面向对象编程语言的课程的一些幻灯片,并进入了类型子类型定义:

Barbara Liskov,“Data Abstraction and Hierarchy”,SIGPLAN Notices,23,5(1988 年 5 月):

这里需要的是类似于下面的替换属性:如果对于每个 S 类型的对象 o_s 有一个 T 类型的对象 o_T 使得对于
根据 T 定义的所有程序 P,当 o_S 被替换时 P 的行为不变对于 o_T 则 S 是 T 的子类型

然后是一个例子:

Point = { x:Integer, y:Integer }
PositivePoint = { x:Positive, y:Positive }
其中Positive = { k:Integer | k > 0 }

我们可以说 PositivePoint ≤ Point 吗?

是的,因为PositivePoint 类型的元素可能总是替换Point 术语定义的程序中的Point 类型的元素!

现在......对我来说,它似乎应该完全相反:Point ≤ PositivePoint 因为我不能在使用负坐标的 Point 的程序中使用 PositivePoint,而我可以相反。

我怀疑语法是Type ≤ Sub-typeor Sub-Type ≤ Type,但语句似乎更清楚,那有什么问题?


编辑

只是为了让事情更容易,问题是:你能说那PositivePoint是 的子类型Point吗?为什么?


第二次编辑

我在这里报告我在评论中写的内容,希望它能让我的问题更清楚:

假设程序必须绘制一个从Point(-100, -100) 到Point(100, 100) 的正方形地图。如果你使用 type 会发生什么 PositivePoint?程序的行为会不会改变?它不会。这种“不变的行为”是我唯一没有得到的。如果子类型的定义只是inheriting and overriding来自其他类型,那没问题,但似乎并非如此。

0 投票
1 回答
247 浏览

design-principles - 使用虚拟方法是否违反 LSP(SOLID 原则的 L 部分)或有一些例外情况?

使用虚拟方法是否违反LSP ( SOLID原则的 L 部分)或有一些例外?

在此先感谢,萨格哈·阿亚兹

0 投票
1 回答
419 浏览

.net - 在 .Net SOLID 设计方面需要帮助

我第一次尝试坚持 Robert Martin 的 SOLID 设计原则,但我并不擅长。

本质上,我需要一个“节点”对象的层次结构。有些节点是 NodeHost,有些是 NodeChildren,有些是 Both。每个人以前都做过这个,但我不知道如何在不使设计过于复杂或在节点子类型中做类似事情的情况下做到这一点:

这违反了里氏替换原则对吧?有什么更好的方法?这就是我现在所拥有的。 替代文字

0 投票
3 回答
187 浏览

parsing - Liskov 替换原则和原陈述的方向性

今晚我在 Ward 的 wiki 上看到了 Liskov Substitution Principle 的原始声明:

这里需要的是类似于下面的替换属性:如果对于每个 S 类型的对象 o1 都有一个 T 类型的对象 o2 使得对于所有根据 T 定义的程序 P,当 o1 被替换时 P 的行为不变对于 o2,则 S 是 T 的子类型。” - Barbara Liskov,Data Abstraction and Hierarchy,SIGPLAN Notices,23,5(1988 年 5 月)。

我一直不擅长解析谓词逻辑(虽然我第一次失败了 Calc IV),所以虽然我有点理解上述内容如何转化为:

使用指向基类的指针或引用的函数必须能够在不知情的情况下使用派生类的对象。

我不明白的是为什么 Liskov 描述的属性暗示 S 是 T 的子类型,而不是相反。

也许我对 OOP 的了解还不够,但是为什么 Liskov 的陈述只允许 S -> T 的可能性,而不是 T -> S 的可能性?

0 投票
8 回答
3232 浏览

c# - ReadOnlyCollection 类是不良设计的一个很好的例子吗?

看看ReadOnlyCollection类的规范,它确实实现了IList接口,对。

IList 接口有 Add/Update/Read 方法,我们称之为接口的前置条件。如果我有 IList,我应该能够在我的应用程序中的任何地方执行所有此类操作。

但是,如果我在代码中的某处返回 ReadOnlyCollection 并尝试调用 .Add(...) 方法呢?它抛出一个 NotSupportedException。你认为这是一个糟糕设计的好例子吗?另外,这个类是否违反了Liskov 替换原则

微软为何采用这种方式?让这个 ReadOnlyCollection 只实现 IEnumerable 接口(顺便说一句,它已经是只读的)是否应该更容易(更好)?

0 投票
1 回答
686 浏览

c#-4.0 - LSP 的协方差和逆变

LSP与协方差和逆变之间有什么关系?有什么关系吗?LSP 是协方差的一种形式吗?

0 投票
4 回答
818 浏览

c# - 这是否违反了 Liskov 替换原则,如果是,我该怎么办?

用例:我正在使用数据模板将 View 与 ViewModel 匹配。数据模板通过检查提供的具体类型的最派生类型来工作,它们不查看它提供的接口,所以我必须在没有接口的情况下这样做。

我在这里简化了示例并省略了 NotifyPropertyChanged 等,但在现实世界中,视图将绑定到 Text 属性。为简单起见,假设带有 TextBlock 的 View 将绑定到 ReadOnlyText,而带有 TextBox 的 View 将绑定到 WritableText。

通过覆盖 OnTextSet 并更改其行为,我是否违反了LSP?如果是这样,有什么更好的方法呢?

0 投票
3 回答
61282 浏览

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

你能用一个很好的 C# 例子来解释 Liskov 替换原则(SOLID 的“L”)吗?如果真的可以。