10

尽管进行了多年的 Delphi 编程,但我还是遇到了一种我从未见过的支持 IUnknown 的类的类声明风格:

TBCUnknown = class(TBCBaseObject, IUnKnown)
private
  FRefCount: integer;
  FOwner   : Pointer;
protected
  function IUnknown.QueryInterface = NonDelegatingQueryInterface;
  function IUnknown._AddRef = NonDelegatingAddRef;
  function IUnknown._Release = NonDelegatingRelease;
  function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
...

如您所见,将类方法分配给 IUnknown 接口方法是在类声明中完成的。这对我来说看起来真的很奇怪,特别是因为在调用构造函数之前我看不到如何分配 IUnknown 方法。这是某种编译时快捷方式,用于在类的方法和类接受的接口的接口指针之间进行分配,稍后在运行时解决?如果有人能提供一些关于它是如何工作的信息以及德尔福成语支持这种结构的信息,我想知道。

4

2 回答 2

12

它被称为方法解析子句,它允许您指定哪个方法实际实现了指定的接口方法。这意味着实现方法可以具有与接口中声明的方法不同的名称(但方法签名仍然必须匹配)。如果没有该子句,Delphi 会根据它们的名称自动解析实现方法。

在您的示例中,声明意味着IUnknown._AddRefTBCUnknown.NonDelegatingAddRefIUnknown._Release实现TBCUnknown.NonDelegatingRelease

据我所知,当接口支持被添加到语言中时,从一开始就支持这一点。您可能没有注意到它,因为它不经常使用或不需要。

于 2011-11-14T16:00:24.167 回答
3

这就是所谓的方法解决条款。从文档中引用:

您可以通过在类声明中包含方法解析子句来覆盖默认的基于名称的映射。当一个类实现两个或多个具有相同名称方法的接口时,使用方法解析子句来解决命名冲突。

于 2011-11-14T16:02:09.610 回答