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

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

要回复问题请先登录注册