【问题标题】:Assigning interface pointers in a Delphi 6 class declaration?在 Delphi 6 类声明中分配接口指针?
【发布时间】:2011-12-28 18:36:50
【问题描述】:

尽管有多年的 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 方法。这是某种编译时快捷方式,用于在类的方法和类接受的接口的接口指针之间进行分配,稍后在运行时解决?如果有人能提供一些关于它是如何工作的以及德尔福惯用语支持这种结构的信息,我想知道。

【问题讨论】:

    标签: delphi interface iunknown


    【解决方案1】:

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

    在您的示例中,声明意味着IUnknown._AddRefTBCUnknown.NonDelegatingAddRef 实现,IUnknown._ReleaseTBCUnknown.NonDelegatingRelease 实现。

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

    【讨论】:

    • 肯定出现在 D5 中。我和你一样怀疑方法解析从一开始就可以使用。
    • @RobertOschler 真的吗?这里显示的是我的 2 分钟后。
    • @Robert TOndrej 在我面前回答。我们同时写下我们的答案。我坚信您应该接受最佳答案而不是第一个答案。这完全取决于您来判断哪个答案是最好的。
    • :-) 谢谢。无论如何,我同意大卫的观点,你应该接受你认为最好的答案(我希望你在这种情况下接受了)。
    • @Robert 我还要说,一般来说,如果您在接受答案之前等待 24 小时左右,那么您可能会得到更多答案,以及更好、更深入的答案。在这种情况下,没有什么比已经说过的要多说的了。但是对于更复杂的问题,如果您将其保留一段时间,这会鼓励人们添加需要更多时间才能产生的非常好的答案。
    【解决方案2】:

    这就是所谓的方法解析子句。引用documentation

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

    【讨论】:

      猜你喜欢
      • 2014-12-01
      • 2018-03-04
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 2017-04-24
      • 1970-01-01
      相关资源
      最近更新 更多