Общая функция интерфейса Delphi, возвращающая TobjectList‹T›

Почему это не работает? Я получаю, что параметр типа E2511 «T» должен быть типом класса?

type
  IBaseProvider<T> = Interface
    function GetAll: TObjectList<T>;
  end;

type
  TCar = class(TInterfacedPersistent, IBaseProvider<TVehicle>)
    function GetAll: TObjectList<TVehicle>;
  end;

implementation

function TCar.GetAll: TObjectList<TVehicle>;
begin
  // do something with Objectlist
  Result := ObjectList
end;

person Godfather75    schedule 02.11.2013    source источник


Ответы (1)


Параметр T в TObjectList<T> должен быть классом.

type
  TObjectList<T: class> = class(TList<T>)
    ....
  end;

Вам нужно объявить ограничение, которое подразумевает это для вашего типа. Например, вы можете объявить одно и то же ограничение:

type
  IBaseProvider<T: class> = Interface
    function GetAll: TObjectList<T>;
  end;

Или вы можете объявить более сильное ограничение, пока соблюдается ограничение TObjectList<T>. Если вы не хотите ограничивать свой параметр, вам нужно использовать TList<T>.

Если вы не знакомы с общими ограничениями, пробелы должны быть заполнены документацией: http://docwiki.embarcadero.com/RADStudio/en/Constraints_in_Generics

person David Heffernan    schedule 02.11.2013
comment
спасибо, Дэвид. А как же TDictionary. в java я могу написать: HashMap‹String, IBaseProvider‹?›› dataproviders = new HashMap‹String, IBaseProvider‹?››();. Как писать в делфи?? - person Godfather75; 03.11.2013
comment
Это другой вопрос. Давайте сначала закончим этот вопрос. - person David Heffernan; 03.11.2013