首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >构造函数是否应该遵循Liskov替换原则?

构造函数是否应该遵循Liskov替换原则?
EN

Stack Overflow用户
提问于 2011-03-31 02:53:55
回答 3查看 3.3K关注 0票数 76

我通常试图确保我的对象实例符合Liskov Substitution Principle,但我一直在想,人们是否认为LSP也应该应用于构造函数?

我试着用谷歌搜索这一点,但无论哪种方式我都找不到任何有力的意见。

我应该注意到,我的大部分代码都是用Ruby编写的,但有时我发现我的子类构造函数与父类略有不同。它们采用相同的基本参数集,并且经常使用额外的参数。有时,其他类方法也会发生这种情况。

在我的脑海中,这总是感觉像是违反了LSP,但我想看看是否有人也有这种感觉。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-31 03:00:18

不,当您使用构造函数时,您知道您正在处理子类型。这允许您具有父构造函数不需要的前提条件,如其他参数。这就是为什么在大多数语言中,构造函数的名称是正在创建的类的名称。

一个很好的例子就是ColoredSquare可以是Square的一个适当的子类型,但需要一个额外的参数:color。如果你做不到这样的事情,子类型就没那么有用了。

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

票数 83
EN

Stack Overflow用户

发布于 2011-03-31 04:05:52

当然不是。

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

我也同意Philip的观点,构造函数实际上不是类型的一部分(在某些语言中,您可以很容易地使用其他工厂来代替构造函数)。使用smalltalk术语,您会说构造函数是元类的方法。

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

票数 16
EN

Stack Overflow用户

发布于 2011-03-31 03:00:04

这是一个固执己见的问题,但我倾向于写我的问题的方式是,额外的参数与改变功能没有真正的关系。我的意思是,当我的构造函数需要一个子类中的额外参数时,它是为了维护标准功能(但做不同的底层工作)。这样,假设我创建了ClassA = new ClassB(带有一些参数);然后,无论我这样做还是使用ClassA = new ClassA(),功能都是相同的;我通常使用某种工厂方法来创建它们,因此它们的工作方式是无缝的。再说一次,这只是我做事的方式,绝不是绝对正确的做事方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5490824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档