dku*_*ubb 63 constructor liskov-substitution-principle class-method
我通常会尝试确保我的对象实例符合Liskov替换原则,但我一直想知道人们是否认为LSP也应该适用于构造函数?
我已经尝试使用谷歌搜索,但无论如何我都无法找到任何强烈的意见.
我应该注意到我的大部分编码都是在Ruby中,但我有时会发现我的子类构造函数与父类略有不同.它们使用相同的基本参数集,通常是额外的参数.有时这也会发生在其他类方法中.
在我的脑后,这总是感觉像LSP违规,但我想看看是否有其他人也有这种感觉.
Phi*_* JF 64
不,当您使用构造函数时,您知道您正在处理子类型.这允许您具有父构造函数不需要的前提条件,例如其他参数.这就是为什么在大多数语言中,构造函数名称是正在创建的类的名称.
这是一个很好的例子,它ColoredSquare
可能是一个合适的子类型Square
,但需要一个额外的参数:color
.如果你不能做这样的事情,那么这种子类型就没那么有用了.
在某种意义上,构造函数实际上不是类型的一部分:它是一个返回该类型元素的函数.因此,为子类型定义新的构造函数不会破坏LSV.
kri*_*iss 14
绝对没有.
构造函数通常专门用于子类型.尝试将LSP应用于构造函数就像是说子类型不能添加特定的方法或成员.但限制只是相反的方式.
而且我也同意Philip的观点,构造函数并不属于某种类型(在某些语言中,您可以轻松地使用其他工厂而不是构造函数).使用smalltalk术语,您会说构造函数是元类的方法.
这里没有违反LSP,它只适用于实例方法,而不适用于类方法(构造函数或任何其他类方法).