TDataProviderThread является потомком TThreadBase, но TThreadBaseList<TDataProviderThread>
не является потомком TThreadBaseList<TThreadBase>
. Это не наследование, это называется ковариацией , и хотя это кажется интуитивно похожим на одно и то же, это не так, и его нужно поддерживать отдельно. На данный момент Delphi его не поддерживает, хотя, надеюсь, это будет в будущем выпуске.
Вот основная причина проблемы ковариации: если функция, с которой вы передаете ее, ожидает список объектов TThreadBase, и вы передаете ей список объектов TDataProviderThread, нет ничего, что могло бы заставить его не вызывать .Add и привязать какой-то другой объект TThreadBase к список, который не является TDataProviderThread, и теперь у вас есть всевозможные уродливые проблемы. Вам нужны специальные трюки от компилятора, чтобы убедиться, что этого не произойдет, иначе вы потеряете безопасность своего типа.
EDIT: Вот вам возможное решение: Сделайте MakeAllThreadsActive в общий метод, например:
procedure MakeAllThreadsActive<T: TThreadBase>(aThreads: TThreadBaseList<T>);
Или вы могли бы сделать то, что предложил Уве Раабе. Любой из них будет работать.