下面的代码不能编译,但是类似的东西是可能的吗?
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.