继承与子类型有何不同?


15

从编程语言的角度来看,子类型是什么意思?我听说“继承不是子类型化”。那么继承和子类型化之间有什么区别?


6
我想知道这个问题(和其他类似问题)在进入公共Beta版后是否可以重定向到新的cs.SE网站?
Suresh Venkat 2012年

1
欢迎来到cstheory,这是有关理论计算机科学(TCS)研究级问题的问答网站。您的问题似乎不是TCS中的研究级问题。请参阅常见问题解答,以了解有关此含义的更多信息以及对可能欢迎您提出问题的网站的建议。最后,如果您的问题由于范围超出范围而被关闭,并且您相信可以编辑该问题以使其成为研究级问题,请随时这样做。关闭不是永久性的,可以重新打开问题,请查看FAQ以获得更多信息。
卡夫

3
@UdayReddy:初次回答时,问题并非微不足道,但我们应该从现代的角度做出决定。与您相同的论点意味着关于Dijkstra算法的问题是话题性的,因为第一篇论文谈到了该问题,而没有其他内容。
伊藤刚(Tsuyoshi Ito)2012年

3
@TsuyoshiIto这个比喻是不恰当的,因为Dijkstra的第一篇论文解决,而Cardelli的第一篇论文这里的问题产生的问题。尽管如此,我还是认为,我们不会根据第一篇论文来衡量最新技术水平。让我向您保证,继承和子类型化之间的差异并不代表已解决的问题,并且我预计至少要再争论20年。可能建议发问者做一些额外的作业,并编辑问题以阐明研究水平的问题。
Uday Reddy'3

3
无论如何,将OP指向Cook等人的同名论文很容易:citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.102.8635
Andreas

Answers:


18

[我还没有对面向对象类型系统的问题进行深入的思考,但是我会说出我所知道的使讨论继续进行。]

我们说如果所有A类型的值都可以在期望B类型的值的每个上下文中使用,则B的子类型。或者,换句话说,A型值可以“伪装”为B型值。一种一种一种

如果这种伪装对类型检查没有问题,即在需要B类型值的地方插入类型值继续进行类型检查,我们将其称为“结构子类型化”。如果它不会引起任何行为问题,即,这种插入不会改变预期的行为,则我们将其称为“行为子类型化”。(“预期的行为”将必须单独形式化,并且许多行为概念都是可能的。)一种

结构子类型不能确保行为子类型,因为类型的结构可能出于偶然原因而匹配。但是,定义预期的行为并不容易。因此,许多编程语言都使用一个中间点,用户必须在其中声明哪种类型是其子类型。这称为“标称子类型化”。参见关于隐式与显式子类型的问题讨论这个问题。这个想法是程序员必须使用自己的独创性来确保所有声明的子类型的行为子类型。该语言无法提供任何帮助。但是,所有声明的子类型必须至少是结构子类型。否则,程序将无法输入检查。语言可以帮助确保这一点。(某些编程语言没有足够好的类型系统来确保在编译时做到这一点。如果是这样,则将在运行时检测到类型失败,或者可能会产生错误的结果。显然,这种类型的漏洞是不希望的。)

当在面向对象程序中定义子类时,通常会添加公开可见的字段(或方法)。在大多数编程语言中,此类子类被视为标称子类型。问题是它们是否也是结构亚型。如果不是这样,即编程语言允许人们声明不是结构子类型的标称子类型,那么在编程语言中将存在类型漏洞。

在简单的情况下,添加字段效果很好。超类的类型期望的字段少于子类的类型。因此,如果您插入需要sueprclass实例的子类实例,则该程序将只忽略提供的其他字段,并且不会出错。

但是,如果超类或子类具有使用与自身相同类型的参数或返回与自身相同类型的结果的方法,则会出现问题。然后,子类的接口类型不是超类的结构子类型。广泛使用的类型安全编程语言(例如Java)不允许此类子类。因此,它们限制了语言以获得类型安全性。据说Eiffel编程语言为了获得灵活性而牺牲了类型安全。如果设计一个保留灵活性的强类型系统,则必须放弃子类产生子类型的原则。因此,论文的标题“继承不是子类型化”。作者提出了另一种高阶子类型的概念,该概念可以代替。金·布鲁斯(Kim Bruce)也有一个密切相关的提案,称为“匹配”,可以达到相同的效果。请参阅此演示文稿。Andrew Black 的立场文件也有帮助。

语义社区可能会因为很大程度上忽略了这个问题而有过错。传统上,我们将其视为实用的类型系统工程问题,几乎没有理论上的兴趣。如果不是这样,并且确实在该领域中有一些语义工作,我希望其他人会提及它们。


1
也许还值得一提的是,有一些实际的语言已经成功地将子类型与继承脱钩,例如对象系统中的Ocaml。
安德烈亚斯·罗斯伯格

@AndreasRossberg的确,当我编写该答案时,OCaml不在我的框架中。我想OCaml根本没有名义子类型。因此,其中一些问题将不会出现。但是,即使行为不匹配,类型也可能会意外匹配,并且类型系统将无法帮助捕获此类错误。
Uday Reddy 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.