2014-06-16 2 views
1

다음은 컴파일되지 않지만 가능한 것입니까?정적 메서드를 사용하여 인터페이스를 구현할 수 있습니까?

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

물론 참조 카운팅을 원하지 않을 것입니다. 따라서 정적 메서드 인터페이스를 찾고 있다면 기본 비교기 인터페이스가 제네릭 단위로 구현되는 방법을 살펴보십시오. 함수 포인터 레코드가 vtable 순서로 배치됩니다. –

+0

예 refcount가 아닌 인터페이스의 경우 가능합니다. 여전히 인스턴스가 필요합니다 (인스턴스가없는 인터페이스는 없습니다). 인스턴스를 상수로 선언 할 수 있으므로 런타임에 인스턴스를 작성할 필요가 없습니다. – kludg

답변

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. 
+0

@ user246408, System.Generics에서 잘 작동하지만 왜 작동하지 않을까요? – Johan

+0

은 System.Generics에 위와 같은 버그가 없음을 의미합니다.) – kludg

+0

@ user246408 실행하면 작동합니다. 왜 그게 잘못이라고 생각하니? 우리를 너무 비밀스럽지 않게 알려주세요. 문제가 있다면 분명히 이해하고 싶습니다. –