Я только что попробовал свое первое использование дженериков в Delphi 2009 и недоумевал, как использовать общий тип в качестве входных данных для функции Supports, используемой для просмотра, реализует ли объект данный интерфейс. Я создал небольшой образец, иллюстрирующий проблему.Использование функции 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 Error] GenericExample.pas (37): E2029 '(' expected but ',' found [DCC Error] Gener icExample.pas (37): E2014 Заявление ожидалось, но выражение типа «Т» найдено
Я не уверен, что компилятор ожидает меня сделать с T при использовании в качестве фактического аргумента функции ,
Я искал вокруг совсем немного и не смог взломать этот. Часть меня подозревает, что если бы я мог понять, как имя интерфейса преобразуется в тип IID: TGUID во время компиляции, при использовании конкретного имени интерфейса я мог бы добиться некоторого прогресса, но это тоже уклонилось от меня.
Любая помощь очень ценится.
Не можете ли вы применить ограничение, что T должен быть определенным интерфейсом с GUID? –
Если это должен быть какой-то интерфейс, тогда код не является общим. Поддержка вернет ссылку на интерфейс; компилятор не может в общем случае превратить это во все, что есть. –
Барри, спасибо за помощь. Большая часть моего опыта работы с общим программированием была на фоне C++, и я ожидал, что компилятор узнает, имеет ли интерфейс Guid так же, как он знал бы, если бы имя интерфейса было предоставлено напрямую. Теперь имеет смысл знать, что генерические шаблоны <> C++. Еще раз спасибо. – Chad