Delphi 可以使用静态方法实现接口吗?
下面的代码没有编译,但是类似的代码可能吗Delphi 可以使用静态方法实现接口吗?,delphi,interface,delphi-xe2,Delphi,Interface,Delphi Xe2,下面的代码没有编译,但是类似的代码可能吗 IDefaultHelp = interface ['{6997FC42-7481-4CDA-940A-0351071266C7}'] function GetTemplate: TXMLDocument; end; TDefaultHelp = class(TInterfacedObject, INodeHelp) class function GetTemplate: TXMLDocument; static;
IDefaultHelp = interface
['{6997FC42-7481-4CDA-940A-0351071266C7}']
function GetTemplate: TXMLDocument;
end;
TDefaultHelp = class(TInterfacedObject, INodeHelp)
class function GetTemplate: TXMLDocument; static; <<-- error
end;
IDefaultHelp=接口
[{6997FC42-7481-4CDA-940A-0351071266C7}]
函数GetTemplate:TXMLDocument;
结束;
TDefaultHelp=class(TInterfacedObject,INodeHelp)
类函数GetTemplate:TXMLDocument;静态 我必须承认,我并不认为有必要避免实例化实例。现在,您不能使用静态类方法来实现接口。如果愿意,您可以通过委托给静态类方法来实现接口
我不希望必须实例化实现对象
因此,将您的问题视为无需实例化对象即可实现接口的愿望,您可以使用常量vtable,以泛型.Defaults
单元中比较器接口的方式实现
例如:
unit Unit1;
interface
uses
Xml.XMLDoc;
type
IDefaultHelp = interface
['{6997FC42-7481-4CDA-940A-0351071266C7}']
function GetTemplate: IXMLDocument;
end;
function GetDefaultHelp: IDefaultHelp;
implementation
function NopAddref(inst: Pointer): Integer; stdcall;
begin
Result := -1;
end;
function NopRelease(inst: Pointer): Integer; stdcall;
begin
Result := -1;
end;
function NopQueryInterface(inst: Pointer; const IID: TGUID; out Obj): HResult;
stdcall;
begin
Result := E_NOINTERFACE;
end;
function GetTemplate(inst: Pointer): IXMLDocument;
begin
Result := TXMLDocument.Create(nil);
end;
const
DefaultHelp_Vtable: array[0..3] of Pointer =
(
@NopQueryInterface,
@NopAddref,
@NopRelease,
@GetTemplate
);
DefaultHelp_Instance: Pointer = @DefaultHelp_Vtable;
function GetDefaultHelp: IDefaultHelp;
begin
Result := IDefaultHelp(@DefaultHelp_Instance);
end;
end.
如果没有实例,谁来跟踪引用计数?当然,您可能不希望引用计数。因此,如果您正在寻找静态方法的接口,请查看在泛型单元中如何实现默认比较器接口。函数指针的记录按vtable顺序排列。是的,这对于非refcounting接口是可能的;您仍然需要一个实例(没有实例就没有接口),但您可以将实例声明为常量,这样您就不需要在运行时创建实例。@user246408,它在System.Generics中工作得很好,为什么在这里不工作?这意味着System.Generics没有像上面那样的错误;)@user246408当我运行它时,它工作。你为什么认为这是错误的?请务必让我们知道,而不是这么神秘。如果有问题,那么我显然想理解它。创建XML文档?我不相信你。@user246408我从Johan的答案中复制了代码,没有看GetTemplate
实际上做了什么。我一生中从未创建过XML文档。怎么了?好吧,这是终身管理,不是吗。如果将nil
传递给TXMLDocument
的构造函数,则新对象的生存期由接口引用管理。试试那个编辑。这就是你的意思吗。