Обща функция на интерфейса на 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‹?››();. Как се пише в delphi?? - person Godfather75; 03.11.2013
comment
Това е друг въпрос. Нека първо да приключим с този въпрос. - person David Heffernan; 03.11.2013