Использование опор () функция с универсальным типом интерфейса

Я только что впервые попробовал использовать универсальные шаблоны в 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»

Я не уверен, что компилятор ожидает от меня, когда он используется в качестве фактического аргумента для функция.

Я поискал довольно много и не смог взломать это. Часть меня подозревает, что, если бы я мог понять, как имя интерфейса преобразуется в тип IID: TGUID во время компиляции, при использовании конкретного имени интерфейса, я мог бы добиться некоторого прогресса, но это тоже меня обошло.

Любая помощь очень ценится.

10
задан Lieven Keersmaekers 13 December 2010 в 07:17
поделиться