首页 > 解决方案 > Liskov 替换原则 4 题

问题描述

我发现很难理解这个概念。我对此有几个问题。我试过在网上查,但那里没有太多关于它的资源。

子类是否需要在其整个生命周期中保持其独特性?

我很确定 LSP 定义了超类和子类之间的合同,如果我错了,请纠正我。

如果给定的函数使用了某个对象,你能用它的一个子类替换该对象而不破坏它的执行吗?

如果有一个类型是超类的变量,程序是否仍然有效。如果我将该超类或任何子类的实例放入该变量中。

如果这没有意义,我很抱歉。这 4 个问题困扰着我关于 LSP 的问题。

非常感谢

标签: design-patternsliskov-substitution-principle

解决方案


LSP:如果S是 的子类T,那么 的每个实例S都是 的实例T

就是这样,真的,但它有影响。

我不知道您所说的子类“保持其独特性”是什么意思。

LSP 确实暗示子类实例必须遵守超类契约,但它实际上是关于它在您使用时或在其他契约中的含义。ST

例如,如果您编写一个Number add(Number a, Number b)应该添加两个数字的函数,那么 LSP 会说这真正意味着它可以将 的任何实例添加Number到 的任何其他实例Number,并且包括任何子类的实例。LSP 说这个函数不可能是正确的,因为它无法知道每个实例对于NumberIntegers、Floats、BigDecimals 等都是不正确的,因为这些都是Number.

如果给定的函数使用了某个对象,你能用它的一个子类替换该对象而不破坏它的执行吗?

如果这是一个参数,而你不能,那么函数不正确,或者子类不正确。

如果有一个类型是超类的变量,程序是否仍然有效。如果我将该超类或任何子类的实例放入该变量

不必要。仅仅因为变量是 type Integer,这并不意味着您可以625任意设置它并期望程序继续工作。 625就像Integer每个S都是T


推荐阅读