如何将接口添加到尚未包含TInterfacedObject的类层次结构中?

时间:2013-09-12 10:25:31

标签: delphi interface

以下示例显示如何开始编码接口:

TMyObject = class
  function Add(a, b: integer): integer;
end;

IInterface = interface
  ['{BFC7867C-6098-4744-9774-35E0A8FE1A1D}']
  function Add(a, b: integer): integer;
end;

TMyObject = class (TInterfacedObject, IInterface 
  function Add(a, b: integer): integer;
end;

但如果该类有一个祖先,我该如何管理,比如说TMyClassDerivedDirectlyFromTObjectSoItsGotNothingInItAtAll?

TMyObject = class(TMyClassDerivedDirectlyFromTObjectSoItsGotNothingInItAtAll)
    function Add(a, b: integer): integer;
end;

2 个答案:

答案 0 :(得分:6)

当你有一个实现接口的类时,这个类必须提供三种方法: _AddRef _Release QueryInterface 。如果你看一下 TInterfacedObject 代码,你会发现那些方法。事实上,只有 TInterfacedObject 才能更容易地创建新的接口实现者类。

如果您无法从 TInterfacedObject 继承新课程,则必须自己提供这些方法。例如,您可以将 TInterfacedObject 实现复制到您的类中,然后您的类将成为一个接口实现者。

答案 1 :(得分:0)

首先:我会重命名界面:

IMyAddFunction = interface
  ['{BFC7867C-6098-4744-9774-35E0A8FE1A1D}']
  function Add(a, b: integer): integer;
end;

如果祖先已经实现了IInterface,那就不难了:

TTable继承自已为您实现(现有)IInterface的TComponent。 所以你可以这样做:

TMyObject = class(TTable, IMyAddFunction)
    function Add(a, b: integer): integer;
end;

如果没有,那么你必须自己实施IInterface:

IInterface = interface
  ['{00000000-0000-0000-C000-000000000046}']
  function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
  function _AddRef: Integer; stdcall;
  function _Release: Integer; stdcall;
end;

Delphi附带了源代码,因此您可以查看TComponent实现的实现,并实现AlexSC给出的答案中引用的方法。