Я только что попробовал свое первое использование обобщений в Delphi 2009 и озадачен тем, как использовать обобщенный тип в качестве входных данных для функции Supports, используемой для проверки, реализует ли объект заданный интерфейс. Я создал небольшой пример, иллюстрирующий проблему.
Имеются следующие типы и функции полезности:
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;
и следующий фрагмент кода:
class procedure TFunctions.Test;
var
myObject: TMyObject;
myInterface: IMyInterface;
begin
myObject := TMyObject.Create;
myInterface := GetInterface<IMyInterface>(myObject);
end;
Я не ожидал бы никаких проблем, но я получаю следующие ошибки времени компиляции:
[Ошибка DCC] GenericExample.pas (37): E2029 '(' ожидается, но ',' найдено
[Ошибка DCC] GenericExample.pas (37): оператор E2014 ожидается, но выражение типа 'T' найдено
Я не уверен, что компилятор ожидает, что я буду делать с T при использовании в качестве фактического аргумента функции.
Я довольно долго искал и не смог его взломать. Часть меня подозревает, что если бы я мог понять, как имя интерфейса преобразуется в тип IID: TGUID во время компиляции, при использовании конкретного имени интерфейса, я мог бы добиться некоторого прогресса, но это также ускользнуло от меня.
Любая помощь очень ценится.