gpt4 book ai didi

delphi - 为什么Delphi记录不能继承?

转载 作者:行者123 更新时间:2023-12-03 14:34:58 26 4
gpt4 key购买 nike

我长期以来一直想知道的事情:为什么 Delphi 记录不能继承(以及所有其他重要的 OOP 功能)?

这本质上会使记录成为类的堆栈分配版本,就像 C++ 类一样,并且会使“对象”(注意:不是实例)过时。我不认为它有什么问题。这也是实现记录前向声明的好机会(我仍然对为什么它仍然缺失感到困惑)。

您发现这有什么问题吗?

最佳答案

与这个问题相关,有两种继承:接口(interface)继承和实现继承。

接口(interface)继承通常意味着多态性。这意味着如果 B 派生自 A,则类型 B 的值可以存储在类型 A 的位置中。由于切片,这对于值类型(如记录)而不是引用类型来说是有问题的。如果 B 大于 A,则将其存储在 A 类型的位置将截断该值 - B 在其定义中添加的任何超出 A 字段的字段都将丢失。

从这个角度来看,实现继承的问题较少。如果 Delphi 有记录继承,但只是实现的记录继承,而不是接口(interface)的记录继承,那么事情还不会太糟糕。唯一的问题是,只需将类型 A 的值设置为类型 B 的字段即可完成您希望从实现继承中实现的大部分功能。

另一个问题是虚拟方法。虚拟方法分派(dispatch)需要某种按值标记来指示该值的运行时类型,以便可以发现正确的重写方法。但是记录没有任何地方可以存储这种类型:记录的字段是它拥有的所有字段。对象(旧的 Turbo Pascal 类型)可以具有虚拟方法,因为它们具有 VMT:层次结构中定义虚拟方法的第一个对象隐式地将 VMT 添加到对象定义的末尾,从而使其增长。但 Turbo Pascal 对象具有与上述相同的切片问题,这使它们成为问题。值类型上的虚拟方法实际上需要接口(interface)继承,这意味着切片问题。

因此,为了正确支持记录接口(interface)继承,我们需要某种解决方案来解决切片问题。装箱是一种解决方案,但它通常需要垃圾收集才能使用,并且会给语言带来歧义,可能不清楚您正在使用值还是引用 - 有点像整数与整数Java 中的 int 具有自动装箱功能。至少在 Java 中,装箱和未装箱的值类型“种类”有不同的名称。另一种装箱方式就像Google Go的接口(interface)一样,它是一种没有实现继承的接口(interface)继承,但要求接口(interface)单独定义,并且所有接口(interface)位置都是引用。当接口(interface)引用引用值类型(例如记录)时,值类型会被装箱。当然,Go 也有垃圾回收功能。

关于delphi - 为什么Delphi记录不能继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2095596/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com