Je viens d'essayer ma première utilisation de génériques dans Delphi 2009 et je suis perplexe sur la façon d'utiliser un type générique comme entrée de la fonction Supports utilisée pour voir si un objet implémente un interface. J'ai créé un petit échantillon illustrant le problème.Utilisation de la fonction Supports() avec le type d'interface générique
Compte tenu de la fonction des types et utilitaire suivant:
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;
et l'extrait de code suivant:
class procedure TFunctions.Test;
var
myObject: TMyObject;
myInterface: IMyInterface;
begin
myObject := TMyObject.Create;
myInterface := GetInterface<IMyInterface>(myObject);
end;
je me attends pas de problème mais je reçois les erreurs lors de la compilation suivantes:
[Erreur DCC] GenericExample.pas (37): E2029 '(' attendu mais ',' trouvé [Erreur DCC] Générer icExample.pas (37): E2014 Déclaration prévu, mais l'expression de type « T » trouvé
Je ne suis pas sûr de ce que le compilateur me attend à voir avec le T lorsqu'il est utilisé comme argument réel à la fonction .
J'ai cherché autour d'un peu et n'ai pas été capable de craquer celui-ci. Une partie de moi soupçonne que si je pouvais comprendre comment un nom d'interface est converti en type IID: TGUID lors de la compilation, en utilisant un nom d'interface concret, je pourrais avancer, mais cela m'a également échappé.
Toute aide est très appréciée.
pouvez-vous pas appliquer une contrainte que T doit être une interface spécifiée qui a un GUID? –
S'il doit s'agir d'une interface, le code n'est pas générique. Les supports renverront une référence d'interface; le compilateur ne peut pas transformer génériquement ce que T est. –
Barry, merci pour votre aide. La plupart de mon expérience avec la programmation générique provenait d'un arrière-plan C++, et je m'attendais à ce que le compilateur sache si une interface a un Guid de la même façon qu'il le ferait si le nom de l'interface était fourni directement. C'est tout à fait logique maintenant de savoir que les génériques <> modèles C++. Merci encore. – Chad