首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从矩形派生正方形是否违反了利斯科夫的替换原理?

从矩形派生正方形是否违反了利斯科夫的替换原理?
EN

Stack Overflow用户
提问于 2009-06-23 03:39:42
回答 5查看 17.5K关注 0票数 70

我对设计和学习设计原则是个新手。

它说,从矩形派生正方形是违反利斯科夫替换原则的经典例子。

如果是这样的话,正确的设计应该是什么?

EN

回答 5

Stack Overflow用户

发布于 2009-06-23 04:00:16

答案取决于可变性。如果矩形和正方形类是不可变的,那么Square实际上是Rectangle的一个子类型,从second派生first是完全可以的。否则,RectangleSquare都可以公开不带变形器的IRectangle,但是从另一个类型派生一个类型是错误的,因为这两个类型都不是另一个类型的子类型。

票数 89
EN

Stack Overflow用户

发布于 2013-08-15 01:14:45

问题是,所描述的内容实际上不是一个“类型”,而是一个累积的紧急属性。

所有你真正拥有的是一个四边形,“正方形”和“矩形”都是从角度和边的属性派生出来的新出现的工件。

“正方形”(甚至是矩形)的整个概念只是对象彼此和相关对象的属性集合的抽象表示,而不是对象本身和对象本身的类型。

这就是在无类型语言的上下文中思考问题会有所帮助的地方,因为不是类型决定它是否是“正方形”,而是对象的实际属性决定它是否是“正方形”。

我猜,如果你想进一步抽象,你甚至不会说你有一个四边形,而是你有一个多边形,甚至只有一个形状。

票数 3
EN

Stack Overflow用户

发布于 2009-06-23 03:53:32

让我们假设我们有一个类Rectangle,它有两个(为了简单起见,public)属性width,height。我们可以更改这两个属性: r.width=1、r.height=2。

现在我们说一个正方形的is_a矩形。但是,尽管声称“一个正方形将表现得像一个矩形”,但我们不能在一个正方形对象上设置.width=1和.height=2 (如果您设置高度,您的类可能会调整宽度,反之亦然)。因此至少有一种情况下,Square类型的对象的行为不像矩形,因此您不能(完全)替换它们。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1030521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档