问题描述
在我能读到的关于 Liskov 替换的所有地方,只有 1 个示例可用,即矩形和方形,并且解释了我们如何违反它,但没有描述纠正措施。 This 链接中提供了一个这样的示例:
如果我们违反了,我想知道纠正措施。
提前致谢。
解决方法
在 Rectangle
和 Square
的情况下,纠正措施很简单,不要在它们之间实现继承。 LSP 告诉我们,两者都不是另一个的父级或子级,因此将它们分开。他们仍然可以是兄弟姐妹,例如两者都可以从 Shape
继承;但它们是 Shape
层次结构的独立分支。
解决两个类之间 LSP 冲突的另一个潜在解决方案是重新定义其中一个或两个。对于 Rectangle
和 Square
这不是一个可行的解决方案,因为它们是数学定义的;但在您可以控制抽象或其实现的情况下,您可以编辑合同以适应代码,反之亦然。