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



下面的代码不能编译,但是类似的东西是可能的吗?

  IDefaultHelp = interface
  ['{6997FC42-7481-4CDA-940A-0351071266C7}']
    function GetTemplate: TXMLDocument;
  end;
  TDefaultHelp = class(TInterfacedObject, INodeHelp)
    class function GetTemplate: TXMLDocument; static;  <<-- error
  end;

我不想实例化实现对象。

是否有一种方法来实现接口,而不必Create一个实际的类?

我必须承认,我并不认为有必要避免实例化。现在,您不能使用静态类方法来实现接口。如果愿意,可以通过委托给静态类方法来实现接口。

我不想实例化实现对象。

因此,将您的问题视为希望在不需要实例化对象的情况下实现接口,您可以使用常量虚函数表,以Generics.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.

最新更新