我通常会尝试确保我的对象实例符合Liskov Substitution Principle,但我一直想知道人们是否认为LSP也应该适用于构造函数?
我已经尝试使用Google搜索,但无论如何我都无法找到任何强烈的意见。
我应该注意到我的大部分编码都是在Ruby中,但我有时会发现我的子类构造函数与父类略有不同。它们使用相同的基本参数集,通常是额外的参数。有时这也会发生在其他类方法中。
在我的脑海中,这总是感觉像是LSP违规,但我想看看是否有其他人也有这种感觉。
答案 0 :(得分:63)
不,当您使用构造函数时,您知道您正在处理子类型。这允许您具有父构造函数不需要的前提条件,例如其他参数。这就是为什么在大多数语言中,构造函数名称是正在创建的类的名称。
一个很好的示例,说明ColoredSquare
可能是Square
的正确子类型,但需要额外的参数:color
。如果你不能做这样的事情,那么这种子类型就没用了。
在某种意义上,构造函数实际上不是该类型的一部分:它是一个返回该类型元素的函数。因此,为子类型定义新的构造函数不会破坏LSV。
答案 1 :(得分:14)
绝对没有。
构造函数通常专门用于子类型。尝试将LSP应用于构造函数就像是说子类型不能添加特定的方法或成员。但限制只是相反的方式。
我同意Philip的观点,构造函数并不是一个类型的一部分(在某些语言中,您可以轻松地使用其他工厂而不是构造函数)。使用smalltalk术语,你会说构造函数是元类的方法。
这里没有违反LSP,它只适用于实例方法,而不适用于类方法(构造函数或任何其他类方法)。
答案 2 :(得分:1)
这是一个自以为是的问题,但我倾向于写我的方式是额外的参数对改变功能没有实际影响。我的意思是,当我的构造函数在子类中需要一个额外的参数时,它是维护标准功能(但做不同的底层事物),这样我就可以创建ClassA = new ClassB(带有一些args);那么无论我这样做还是ClassA = new ClassA(),功能都是一样的;我通常使用某种Factory方法来创建它们,因此它们的工作方式是无缝的。这也是我做事的方式,绝不是绝对正确的做事方式。