У меня есть список типа TList<TForm>
. Мне нужно бросить его и использовать как TList<TObject>
вот так:
procedure mainForm.testCast;
var
listT: TList<TForm>;
listW: TList<TObject>;
obj: TObject;
begin
listT := TList<TForm>.create;
listT.add(form1);
listT.add(form2);
listW := TList<TObject>(listT); // Casting is OK
// This works, but is this fine?
for obj in listW do
memo1.lines.add(obj.className);
end;
Образец работает так, как ожидалось, но можно ли использовать его между общими списками? Приведет ли это к повреждению структуры данных и т. д.? Я использую его только для зацикливания (DoGetEnumerator
) и некоторых проверок строк, т.е. я не буду добавлять/удалять элементы.
Реальная функция немного сложнее. Он получает ссылку на listT
, используя RTTI в файле TValue
. Основная цель не связать FMX.Forms
в моём подразделении.
Обновление: Почему TGeneric‹Base› и TGeneric‹ Потомки› несовместимых типов?
TForm
является производным отTObject
, аTList<TSomeThing>
— это общий список типизированных указателей, в том, что вы делаете, нет ничего плохого. То есть с использованием методов из базового класса. - person LU RD   schedule 10.02.2014TList<TObject>
не является базовым классом дляTList<TForm>
. Вы обнаружите, чтоTList<TForm> is TList<TObject>
оценивается какFalse
. Общая базаTList<T>
. Другой способ думать об этом. Если бы это было просто использование методов из базового класса, зачем понадобилось бы приведение? - person David Heffernan   schedule 10.02.2014is
здесь не годится, потому что это оба класса. я имел в видуTList<TForm>.InheritsFrom(TList<TObject>)
- person David Heffernan   schedule 10.02.2014TForm
vsTObject
. Я ожидаю, чтоTList<TForm>
будет вести себя так же, какTList<TObject>
, в то время как это не будет верно для любогоTList<T>
. - person LU RD   schedule 10.02.2014TList<T>
обрабатываетT
иначе, еслиT
— это любой объект, основанный наTObject
? Технически, я думаю, это было бы возможно, но не слишком ли это далеко? - person LU RD   schedule 10.02.2014as
- person David Heffernan   schedule 10.02.2014