以下示例显示如何开始编码接口:
这
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;
答案 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给出的答案中引用的方法。