Нет, нет "базового класса TDictionary, с которого происходят все версии TDictionary". Типы параметров являются частью типа класса. Родительский класс TDictionary<T, U>
равен TEnumerable<TPair<T, U>>
, а родительский класс TObject
.
Это немного раздражает, но необходимо сохранять безопасность типов. Допустим, у вас есть TDictionary<string, TMyObject>
, и вы передали его функции, ожидающей TDictionary<string, TObject>
. Вы можете ожидать, что это сработает, поскольку вы можете передать TMyObject параметру TObject. Но это не так, и на то есть веская причина.
Компилятор не может проверить фактический тип внутри принимающей функции во время компиляции, поэтому ничто не мешает подпрограмме взять ваш словарь и вызвать .Add(Self.Name, Self)
, где Self - это TForm (или что-то еще), а не TMyObject. Поскольку все ссылки на объекты имеют размер sizeof (указатель) по размеру, это, похоже, будет работать нормально, но когда вы вернете его в свой код, который знает, каким должен быть второй параметр, у вас возникнет большая проблема.
Есть способы заставить Generics работать так, как вы ожидаете, не нарушая безопасность типов, накладывая ограничения на принимающую функцию, но Delphi в настоящее время не реализует ее. Delphi Prism делает, и я пытался заставить команду Delphi реализовать ее в следующем выпуске, но мы должны увидеть ...