以下内容无法编译,但有可能吗?
IDefaultHelp = interface
['{6997FC42-7481-4CDA-940A-0351071266C7}']
function GetTemplate: TXMLDocument;
end;
TDefaultHelp = class(TInterfacedObject, INodeHelp)
class function GetTemplate: TXMLDocument; static; <<-- error
end;
我不想实例化实现对象。
有没有办法在不必Create
实际课程的情况下实施界面?
答案 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.