在Circle-Ellipse Problem中有一个违反Liskov替换原则的好例子。
以下是a popular SO answer中的措辞(尽管是矩形和正方形):
在数学中,
Square
是Rectangle
。实际上它是一个矩形的专业化。 “是一个”让你想要继承模型。但是,如果您在代码中Square
派生自Rectangle
,则Square
应该可以在您期望Rectangle
的任何位置使用。这会产生一些奇怪的行为。想象一下,你的Rectangle基类上有
SetWidth
和SetHeight
个方法;这似乎完全符合逻辑。但是,如果您的Rectangle引用指向Square
,则SetWidth
和SetHeight
没有意义,因为设置一个将更改另一个以匹配它。在这种情况下,Square使用Rectangle
使Liskov替换测试失败,并且从Rectangle继承Square的抽象是不好的。
我的问题是 - 给定一个解决方案,我们在setWidth
中覆盖Square
,并将width
和height
设置为相同的值,为什么它仍然违反LSP?
答案 0 :(得分:2)
确实违反了它,因为您承诺setWidth()
会设置宽度,setHeight()
会设置高度。 Square
会破坏Rectangle
所做的(隐含)承诺。