필자는 인스턴스를 인스턴스화하지 않아도되는지 실제로 인정하지 않습니다. 이제 정적 클래스 메서드를 사용하여 인터페이스를 구현할 수 없습니다. 원하는 경우 정적 클래스 메서드에 위임하여 인터페이스를 구현할 수 있습니다.
구현 개체를 인스턴스화 할 필요가 없습니다.
그래서, 객체를 생성 할 필요없이 인터페이스를 구현하는 욕망으로 질문을 가지고, 당신은 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.
참조 횟수를 추적하는거야 어떤 인스턴스가없는 경우? –
물론 참조 카운팅을 원하지 않을 것입니다. 따라서 정적 메서드 인터페이스를 찾고 있다면 기본 비교기 인터페이스가 제네릭 단위로 구현되는 방법을 살펴보십시오. 함수 포인터 레코드가 vtable 순서로 배치됩니다. –
예 refcount가 아닌 인터페이스의 경우 가능합니다. 여전히 인스턴스가 필요합니다 (인스턴스가없는 인터페이스는 없습니다). 인스턴스를 상수로 선언 할 수 있으므로 런타임에 인스턴스를 작성할 필요가 없습니다. – kludg