我对设计和学习设计原则是个新手。
它说,从矩形派生正方形是违反利斯科夫替换原则的经典例子。
如果是这样的话,正确的设计应该是什么?
发布于 2009-06-23 04:00:16
答案取决于可变性。如果矩形和正方形类是不可变的,那么Square
实际上是Rectangle
的一个子类型,从second派生first是完全可以的。否则,Rectangle
和Square
都可以公开不带变形器的IRectangle
,但是从另一个类型派生一个类型是错误的,因为这两个类型都不是另一个类型的子类型。
发布于 2013-08-15 01:14:45
问题是,所描述的内容实际上不是一个“类型”,而是一个累积的紧急属性。
所有你真正拥有的是一个四边形,“正方形”和“矩形”都是从角度和边的属性派生出来的新出现的工件。
“正方形”(甚至是矩形)的整个概念只是对象彼此和相关对象的属性集合的抽象表示,而不是对象本身和对象本身的类型。
这就是在无类型语言的上下文中思考问题会有所帮助的地方,因为不是类型决定它是否是“正方形”,而是对象的实际属性决定它是否是“正方形”。
我猜,如果你想进一步抽象,你甚至不会说你有一个四边形,而是你有一个多边形,甚至只有一个形状。
发布于 2009-06-23 03:53:32
让我们假设我们有一个类Rectangle,它有两个(为了简单起见,public)属性width,height。我们可以更改这两个属性: r.width=1、r.height=2。
现在我们说一个正方形的is_a矩形。但是,尽管声称“一个正方形将表现得像一个矩形”,但我们不能在一个正方形对象上设置.width=1和.height=2 (如果您设置高度,您的类可能会调整宽度,反之亦然)。因此至少有一种情况下,Square类型的对象的行为不像矩形,因此您不能(完全)替换它们。
https://stackoverflow.com/questions/1030521
复制相似问题