2014-10-03 7 views
7

Ho creato un metodo di classe in una classe che implementa un'interfaccia, ma non riesco a definirlo all'interno dell'interfaccia.Come supportare i metodi di classe nelle definizioni di interfaccia in Delphi

IMyClass = interface 
    procedure someproc(); 
    class function myfunc() : TMyClass; // compiler doesn't like this! 
end; 

TMyClass = class(TInterfacedObject, IMyClass) 
public 
    procedure someproc(); 
    class function myfunc() : TMyClass; 
end; 

voglio myfunc() per creare e restituire un'istanza di TMyClass. Per esempio:

somefunc(TMyClass.myfunc(), ...); 

crea un'istanza di TMyClass e passa in somefunc.

Posso definire function myfunc() : TMyClass; nell'interfaccia IMyClass, ma se inserisco class di fronte ad esso, il compilatore mi dà un errore. Se lo lascio, mi dà molti altri errori "E2291 Implementazione mancante del metodo di interfaccia xyz.myfunc" Semplicemente non accetta la stessa firma nell'interfaccia come nella classe.

Ho pensato di aver visto questo lavoro prima (i metodi di classe definiti nelle interfacce) ma forse no.

Se questo non è supportato direttamente, come si fa?

(sto usando Delphi XE5, nel caso in cui conta.)

+0

Implementare il metodo di interfaccia con un metodo di istanza piuttosto che un metodo di classe –

+0

Funziona come un metodo di istanza, ma richiede un'istanza piuttosto rispetto alla classe. –

+0

Esatto. Hai bisogno di un'istanza per implementare un'interfaccia. –

risposta

5

interfacce non sono classi e non supportano i metodi contrassegnati come class, supportano solo non class metodi che vengono implementati e chiamati istanze di oggetti .

È probabile che ciò che si sta cercando sarà implementato come factory di classe anziché utilizzare un'interfaccia.

0

È possibile definire un metodo di classe (procedura di classe in Delphi) in una definizione di classe (TMyClass) ma non nell'interfaccia (IMyClass).

+0

David non sta provando a definire un metodo di classe in un'interfaccia. Sta cercando di implementare un metodo di interfaccia con un metodo di classe. –

2

Quello che stai cercando di ottenere è impossibile perché viola le specifiche binarie delle interfacce Delphi.

Qualsiasi metodo di interfaccia in Delphi ha nascosto il primo parametro - puntatore a un'istanza. I metodi di istanza hanno lo stesso parametro nascosto (Self, lo stesso puntatore a un'istanza) e per questo sono binari compatibili con i metodi di interfaccia.

D'altra parte il parametro nascosto di un metodo di classe è un puntatore alla classe vtable, quindi i metodi di classe Delphi sono incompartibili binari con i metodi di interfaccia Delphi.

Ipoteticamente si potrebbe pensare le seguenti dichiarazioni (compatibile a livello binario):

IMyClass = interface 
    procedure someproc(); 
    function myfunc(): TMyClass; 
end; 

TMyClass = class(TInterfacedObject, IMyClass) 
public 
    procedure someproc(); 
    class function myfunc(Inst: TMyClass) : TMyClass; static; 
end; 

Qui uso static identificatore per rimuovere il parametro nascosto (classe vtable puntatore) non abbiamo bisogno e aggiungere il parametro puntatore di istanza esplicitamente; ma il compilatore supporta tale sintassi perché quanto precede è essenzialmente lo stesso come un semplice

IMyClass = interface 
    procedure someproc(); 
    function myfunc(): TMyClass; 
end; 

TMyClass = class(TInterfacedObject, IMyClass) 
public 
    procedure someproc(); 
    function myfunc() : TMyClass; 
end; 
+0

Bene, se ci dovesse essere una modifica per supportare i metodi di classe nelle interfacce, è sicuro assumere che la rappresentazione binaria cambierà per renderlo possibile. – mjn

Problemi correlati