Дженерики, полиморфизм, интерфейсы: какое решение?

Я знаю, что название очень широкое - охватывает очень многое!

И я надеюсь, что этот вопрос может развиться в более крупную «информационную вики-штуку» по этим темам.

То, что я узнал - на данный момент:

  • При использовании Generics - поймите концепции ( ковариация и контравариантность ).
  • НЕ «неправильно используйте» концепцию дженериков в сочетании с наследованием. Я так и сделал, и это может привести вас прямо к проблемам ковариации! Убедитесь, что вы «разорвали» родовой шаблон в правильном месте в вашем наследовании - если вы их комбинируете.

(пожалуйста, поправьте меня - если вы думаете, что я ошибаюсь, пропускаю или что-то неправильно понял).

Моя проблема заключалась в следующем:

Но к настоящему времени я провел бесчисленное количество часов, пытаясь понять, как решить эту «большую головоломку», лежащую у меня на столе.И я уже получил несколько хороших ответов от некоторых из вас, пользователей SO, но теперь пришло время заставить что-то работать в большем масштабе.

Я рискнул обратиться к Generics с этим: Обобщение и полиморфизм работают вместе

И теперь я как бы застрял на этом: Ситуации, в которых обобщения не работают

Почему у меня возникают проблемы с ковариацией - это из-за моей процедуры класса в моей иерархии.

Так что мне интересно, станет ли Интерфейсы моим следующим смелым ходом в этой «саге». Как «перешагнуть» проблему ковариации. Одно дело - выяснить, что у вас действительно есть эта проблема, другое - «как ее обойти».

Итак, ЕСЛИ у кого-то из вас, хороших людей, «оттуда» есть какое-то мнение по этому поводу - я весь уши. В основном : Скажите мне перейти на интерфейсы (я никогда не делал ничего с нуля). Или .. бросьте мне кость в том направлении, которое вы предложите.

Мой текущий пул источников указан во второй ссылке - сверху.

Вот небольшой отрывок из моего более раннего сообщения , который показывает мою проблему ковариации. Дэвид любезно объяснил - Почему я врезался в кусты .. Но теперь мне нужна информация о - Как бегать по нему.

var    
  aList : TBaseList;  // used as a list parameter for methods
  aPersonList : TPersonList;
  aCustomerList : TCustomerList;
begin
  aPersonList := TPersonList.Create;
  aCustomerList := TCustomerList.Create;

  aList := aCustomerList;  <-- this FAILS !!  types not equal ..

end;

С уважением

6
задан Community 23 May 2017 в 10:28
поделиться