为什么“Circle-ellipse”的解决方案违反了“Liskov Substition Principle”?

时间:2018-03-11 12:32:11

标签: oop liskov-substitution-principle

Circle-Ellipse Problem中有一个违反Liskov替换原则的好例子。

以下是a popular SO answer中的措辞(尽管是矩形和正方形):

  

在数学中,SquareRectangle。实际上它是一个矩形的专业化。 “是一个”让你想要继承模型。但是,如果您在代码中Square派生自Rectangle,则Square应该可以在您期望Rectangle的任何位置使用。这会产生一些奇怪的行为。

     

想象一下,你的Rectangle基类上有SetWidthSetHeight个方法;这似乎完全符合逻辑。但是,如果您的Rectangle引用指向Square,则SetWidthSetHeight没有意义,因为设置一个将更改另一个以匹配它。在这种情况下,Square使用Rectangle使Liskov替换测试失败,并且从Rectangle继承Square的抽象是不好的。

我的问题是 - 给定一个解决方案,我们在setWidth中覆盖Square,并将widthheight设置为相同的值,为什么它仍然违反LSP?

1 个答案:

答案 0 :(得分:2)

确实违反了它,因为您承诺setWidth()会设置宽度,setHeight()会设置高度。 Square会破坏Rectangle所做的(隐含)承诺。