Почему являются TGeneric <Основа> и TGeneric <Порожденными> несовместимыми типами?

Существует версия XP , Связывают , вероятно, работая как служба Windows.

13
задан Rob Kennedy 6 November 2009 в 16:24
поделиться

2 ответа

TDataProviderThread является потомком TThreadBase, но TThreadBaseList не является потомком TThreadBaseList . Это не наследование, это называется ковариацией , и хотя интуитивно кажется, что это одно и то же, это не так, и ее нужно поддерживать отдельно. На данный момент Delphi не поддерживает его, хотя, надеюсь, он будет в следующем выпуске.

Вот основная причина проблемы ковариации: если функция, которой вы ее передаете, ожидает список объектов TThreadBase, и вы передаете это список объектов TDataProviderThread, ничто не мешает ему вызвать .Add и вставить в список какой-либо другой объект TThreadBase, который не является TDataProviderThread, и теперь вы у меня всякие уродливые проблемы. Вам потребуются специальные приемы от компилятора, чтобы убедиться, что этого не произойдет, иначе вы потеряете безопасность типов.

РЕДАКТИРОВАТЬ: Вот возможное решение для вас: Превратите MakeAllThreadsActive в общий метод, например:

procedure MakeAllThreadsActive<T: TThreadBase>(aThreads: TThreadBaseList<T>);

Или вы мог сделать то, что предложил Уве Раабе. Любой из них будет работать.

22
ответ дан 1 December 2019 в 20:57
поделиться

Тип

TList <TBase>

не является родительским типом для

TList <TChild>

Универсальные шаблоны не могут использоваться таким образом.

6
ответ дан 1 December 2019 в 20:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: