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
的构造函数,则新对象的生存期由接口引用管理。试试那个编辑。这就是你的意思吗。