【发布时间】:2018-03-11 12:32:11
【问题描述】:
Circle-Ellipse Problem 中有一个违反里氏替换原则的好例子。
这是a popular SO answer 中的措辞(尽管是矩形和正方形):
在数学中,
Square是Rectangle。实际上,它是矩形的特化。 “is a”让你想用继承来建模。但是,如果在代码中您将Square派生自Rectangle,那么Square应该可以在您期望Rectangle的任何地方使用。这会导致一些奇怪的行为。想象一下,您的 Rectangle 基类上有
SetWidth和SetHeight方法;这似乎完全合乎逻辑。但是,如果您的 Rectangle 引用指向Square,则SetWidth和SetHeight没有意义,因为设置一个会更改另一个以匹配它。在这种情况下,Square 未能通过Rectangle的 Liskov 替换测试,并且 Square 从 Rectangle 继承的抽象是一个糟糕的抽象。
我的问题是 - 给定一个解决方案,我们在 Square 中覆盖 setWidth,实现将 width 和 height 设置为相同的值,为什么它仍然违反语言服务提供商?
【问题讨论】:
标签: oop liskov-substitution-principle