【问题标题】:Why Delphi objects that implement interfaces need to be reference counted?为什么实现接口的Delphi对象需要引用计数?
【发布时间】:2014-04-07 09:57:46
【问题描述】:

换句话说,为什么不能像普通对象一样手动管理它们?还是 Delphi 设计者只是决定使用引用计数,因为 COM 无论如何都需要它?

【问题讨论】:

  • 接口什么都不做。如何管理引用计数取决于实现接口的类。无论如何,较新的基于 LLVM 的 Delphi 编译器也引入了对象引用的引用计数。
  • @GünthertheBeautiful 这是真的。但是所有 Delphi 接口都派生自IInterface,因此分配引用会导致编译器生成对_AddRef_Release 的调用。实现对象可能什么都不做,但调用仍然存在。这是不需要做的事情,也没有融入到 C 和 C++ 等语言中。
  • 事实上,不是对象被引用计数,而是接口被计数。当然,对象也必须实现那部分,但是对 AddRef 和 Release 的调用通常在接口上,而不是在对象上。

标签: delphi interface com


【解决方案1】:

首先要确定的是,在 Delphi 中添加了接口以支持 COM。因此,许多设计决策都是出于使 COM 编程更容易的愿望。

接口引用完全可以手动管理。事实上,C 和 C++ 中的原始 COM 最初确实涉及手动引用计数管理,显式调用 AddRefRelease。从 C 中使用 COM 对象时,您仍然需要执行手动引用计数管理。对于现在的 C++,您通常使用像 CComPtr 这样的类来启用自动引用计数管理。

当Delphi 添加COM 支持时,Delphi 的主要竞争对手是VB。而在 VB 中,您永远不必进行手动引用计数管理。如果 Delphi 的设计者没有实现自动引用计数管理,那么要吸引 VB 程序员离开 VB 并开始使用 Delphi 会更加困难。所以,我推测这是德尔福设计师做出决定的一个驱动因素。即使不是这样,针对自动引用计数编写代码也比手动编写代码要容易得多。因此,即使我的推测是错误的,Delphi 设计师所做的决定也会让生活变得简单得多。

所以来回答你的具体问题:

为什么不能像普通对象一样手动管理它们?

他们可以。您可以实现_AddRef_Release,这样它们就不会控制对象的生命周期。具体来说,这些方法不强制计数引用,_Release 也不需要调用Free

Delphi 设计者是否只是决定使用引用计数,因为 COM 需要它?

嗯,COM 不需要它。正如我上面所说,您可以使用 C 或 C++(或实际上是其他语言)针对 COM 编写代码,而无需自动引用计数。


您可能会问的另一个问题是,为什么 Delphi 接口必须从 IInterface 派生。这源于它们最初的目的,即实现 COM 接口。在许多方面,如果我们可以拥有不是从IInterface 派生的接口,那就太好了。但事实就是如此。

【讨论】:

  • 请注意,派生自 TComponent 的 Delphi 对象确实禁用了引用计数,如果它实现了任何接口。并且之前已经多次请求向编译器引入新的非引用接口类型,Embarcadero 也意识到了这一点。它是否会被实施是任何人的猜测。
猜你喜欢
  • 2019-01-07
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 2019-02-06
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
相关资源
最近更新 更多