可以使用静态方法实现接口吗?

时间:2014-06-16 17:02:26

标签: delphi interface delphi-xe2

以下内容无法编译,但有可能吗?

  IDefaultHelp = interface
  ['{6997FC42-7481-4CDA-940A-0351071266C7}']
    function GetTemplate: TXMLDocument;

  end;

  TDefaultHelp = class(TInterfacedObject, INodeHelp)
    class function GetTemplate: TXMLDocument; static;  <<-- error
  end;

我不想实例化实现对象。

有没有办法在不必Create实际课程的情况下实施界面?

1 个答案:

答案 0 :(得分:1)

我必须承认,我并没有真正意识到需要避免实例化实例。现在,您无法使用静态类方法来实现接口。如果您愿意,可以通过委托静态类方法来实现接口。

  

我不想要实例化实现对象。

因此,将您的问题作为实现接口的愿望而不需要实例化对象,您可以使用以Generics.Defaults单元的比较器接口方式实现的常量vtable。

例如:

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.