【发布时间】:2011-01-06 14:56:55
【问题描述】:
我一直想知道这一点,但为什么 Delphi 中的类不能使用运算符重载?
我记得在跑步时读过一次答案,它说它会与某些东西发生冲突,但我记不起来了。据我所知,只有隐式运算符可能会导致一些问题,因为类存储在堆上,分配实际上是堆地址的副本(基本上是复制指针)。
【问题讨论】:
-
它可以在 Delphi.NET 中工作,因为 .NET 会进行垃圾收集。这可以在本机 Delphi 中通过两种方式解决: 1. 如果接口上允许运算符,并且实现这些运算符的类将从 TInterfacedObject 继承。 2. 如果托管类被添加到 Delphi 语言中。现在,Mason 是对的:你会到处出现内存泄漏。另请参阅此链接上引用的我的演讲:wiert.wordpress.com/2009/10/19/…
-
是的,我明白为什么这可能被视为一个问题,而这正是我在那篇文章中读到的内容,现在我记得了。但是,正如我在对 Mason 回答的评论中所说的那样,我认为这实际上并不是一个限制,因为我认为如果您只实施一点垃圾收集(不会有任何副作用),您就可以做到这一点。
-
如果接口有运算符,那么就会出现很多问题,例如无法取消某些运算符。例如,想象在接口中有一个隐式运算符,然后有一个确实需要该接口但绝对不需要隐式运算符的对象。当你尝试一项任务时,所有的地狱都可能会崩溃,而且很难找到你的问题。问题是,运算符永远不应该被继承,如果你想使用“继承”的版本,你应该再次重载它,然后进行类型转换。但这意味着类也必须拥有它。
-
托管类不就是记录吗?当然,它们没有继承和真正定义 OOP 的所有其他特性,但它们可以。
-
是的,您可以将运算符重载实现为接口,但这会导致其自身的问题。一旦你获取一个 TInterfacedObject 并将其接口引用计数设置为 1,将其视为普通对象不再安全,因为一旦对它的最后一个接口引用消失,它就会消失。
标签: delphi class operator-overloading