如何防止违反 Liskov 替换

问题描述

在我能读到的关于 Liskov 替换的所有地方,只有 1 个示例可用,即矩形和方形,并且解释了我们如何违反它,但没有描述纠正措施。 This 链接中提供了一个这样的示例:

如果我们违反了,我想知道纠正措施。

提前致谢。

解决方法

RectangleSquare 的情况下,纠正措施很简单,不要在它们之间实现继承。 LSP 告诉我们,两者都不是另一个的父级或子级,因此将它们分开。他们仍然可以是兄弟姐妹,例如两者都可以从 Shape 继承;但它们是 Shape 层次结构的独立分支。

解决两个类之间 LSP 冲突的另一个潜在解决方案是重新定义其中一个或两个。对于 RectangleSquare 这不是一个可行的解决方案,因为它们是数学定义的;但在您可以控制抽象或其实现的情况下,您可以编辑合同以适应代码,反之亦然。