Имеем 2 базовых класса:
TData = class; // Данные
TDataList<T: TData> = class(TObjectList<T>); // Список
так же имеем несколько наследников:
TData2 = class(TData);
TDataList2 = class(TDataList<TData2>);
TData3 = class(TData);
TDataList3 = class(TDataList<TData3>);
// ... и т.д.
Каждый список является наследником TDataList со своим типом данных, унаследованным от TData.
Требуется иметь возможность все эти типы TDataList2, TDataList3 и т.д. привести к единому родительскому типу, для работы на уровне списков TDataList и элементов TData.
Пробовался такой код:
procedure Test;
var
DataListCommon: TDataList<TData>;
DL2: TDataList2;
begin
DL2 := TDataList2.Create; // это можно опустить, на компилятор это не влияет
DataListCommon := DL2; // <-- [dcc32 Error] Unit1.pas(44): E2010 Incompatible types: 'Unit1.TDataList<Unit1.TData>' and 'TDataList2'
DataListCommon := DL2 as TDataList<TData>; // Та-же ошибка
DataListCommon := TDataList<TData>(DL2); // Компилируется и работает (по крайней мере ошибок замечено не было)
end;
Насколько правомерно использовать компилирующийся вариант приведения типов в данном случае?