施工人员是否应该遵守Liskov替代原则?

我通常试图确保我的对象实例符合Liskovreplace原则 ,但是我一直在想,人们是否也认为LSP也适用于构造函数呢?

我尝试了谷歌search,但我一直无法find任何强烈的意见。

我应该注意到,我的大部分代码都是在Ruby中,但是我有时会发现我的子类构造函数与父类稍有不同。 他们采用相同的基本参数集,通常是额外的参数。 有时这也会发生在其他类的方法。

在我的脑海里,这总是感觉像一个LSP的侵犯,但我想看看是否有其他人也这样认为。

不,当你使用构造函数时,你知道你正在处理这个子types。 这使您可以具有父构造函数不需要的前置条件,如其他参数。 这就是为什么在大多数语言中,构造函数的名字就是被创build的类的名字。

这是一个很好的例子,一个ColoredSquare可能是Square一个合适的子types,但是需要一个额外的参数: color 。 如果你不能做这样的事情,那么这个子types的用处就会less得多。

从某种意义上说,构造函数并不是这个types的一部分:它是一个返回该types元素的函数。 因此,为一个子types定义一个新的构造函数不会破坏LSV。

肯定没有

构造函数通常专门用于子types。 试图将LSP应用于构造函数就像说子类不能添加特定的方法或成员。 但是限制只是相反的。

我也同意菲利普,构造函数不是一个types的一部分(在一些语言中,你可以轻松地使用其他工厂,而不是构造函数)。 使用smalltalk术语,你会说构造函数是元类的方法。

这里没有违反LSP,只适用于实例方法,而不适用于类方法(构造函数或任何其他类方法)。

这是一个自以为是的问题,但我倾向于写我的方式是这样的,额外的参数对改变function没有真正的影响。 我的意思是说,当我的构造函数在子类中需要一个额外的参数时,它将保持标准的function(但是做不同的底层事物),这样可以说我创build了ClassA = new ClassB(带有一些参数)。 那么function是相同的,无论我这样做或ClassA =新的ClassA(); 我通常使用某种工厂方法来创build它们,所以它们在工作方式上是无缝的。 这又是我如何做事,绝不是绝对正确的做事方式。