2

以下示例显示了如何开始针对接口进行编码:

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;
4

2 回答 2

6

当你有一个实现接口的类时,这个类必须提供三个方法:_AddRef_ReleaseQueryInterface。如果您查看TInterfacedObject代码,您会注意到那里的那些方法。事实上,TInterfacedObject的存在只是为了更容易创建新的接口实现类。

如果你不能从TInterfacedObject继承你的新类,你必须自己提供这些方法。例如,您可以将TInterfacedObject实现复制到您的类,然后您的类将成为接口实现者。

于 2013-09-12T10:35:44.347 回答
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 给出的答案中引用的方法。

于 2013-09-12T11:04:38.320 回答