Ho appena provato il mio primo utilizzo di generici in Delphi 2009 e sono perplesso su come utilizzare un tipo generico come input per la funzione Supports usata per vedere se un oggetto implementa un dato interfaccia. Ho creato un piccolo esempio che illustra il problema.Uso della funzione Supports() con interfaccia generica tipo
Dato il seguente tipo e funzione di utilità:
IMyInterface = interface
['{60F37191-5B95-45BC-8C14-76633826889E}']
end;
TMyObject = class(TInterfacedObject, IMyInterface)
end;
class function TFunctions.GetInterface<T>(myObject: TObject): T;
var
specificInterface: T;
begin
// This would compile, but looses the generic capability
//Supports(myObject, IMyInterface, specificInterface);
// This results in compile errors
Supports(myObject, T, specificInterface);
result := specificInterface;
end;
e il seguente frammento di codice:
class procedure TFunctions.Test;
var
myObject: TMyObject;
myInterface: IMyInterface;
begin
myObject := TMyObject.Create;
myInterface := GetInterface<IMyInterface>(myObject);
end;
mi si aspetterebbe problemi ma ottengo i seguenti errori in fase di compilazione:
[Errore DCC] GenericExample.pas (37): E2029 '(' previsto ma ',' trovato [Errore DCC] Generazione icExample.pas (37): E2014 Dichiarazione previsto, ma l'espressione di tipo 'T' trovato
io non sono sicuro di quello che il compilatore mi sta aspettando a che fare con la T quando viene utilizzato come argomento attuale della funzione .
Ho cercato in giro un po 'e non sono stato in grado di rompere questo. Una parte di me sospetta che se potessi capire come un nome di interfaccia viene convertito nel tipo IID: TGUID durante la compilazione, quando si utilizza un nome di interfaccia concreta, potrei fare qualche progresso, ma anche questo mi ha eluso.
Qualsiasi aiuto è molto apprezzato.
non si può applicare un vincolo che T deve essere un'interfaccia specificata con un GUID? –
Se deve essere presente un'interfaccia, il codice non è generico. I supporti restituiranno un riferimento all'interfaccia; il compilatore non può genericamente trasformarlo in qualunque T sia. –
Barry, grazie per il tuo aiuto. La maggior parte della mia esperienza con la programmazione generica è derivata da uno sfondo C++, e mi aspettavo che il compilatore sapesse se un'interfaccia ha un Guid nello stesso modo in cui avrebbe saputo se il nome dell'interfaccia fosse stato fornito direttamente. Ha perfettamente senso ora sapendo che i modelli generici <> C++. Grazie ancora. – Chad