Мне нравится ответ GameCat (дал +1) для описания ограничений класса.
У меня есть небольшая модификация вашего кода, которая работает. Обратите внимание, что, поскольку вы дали ограничение, чтобы сказать, что T должен быть потомком TItem, вы можете просто объявить ObjectList как TObjectList<TItem>
- здесь не нужно использовать T.
Кроме того, вы можете создать своего рода прокси. Во-первых, обратите внимание на комментарий GameCat о приватности полей.
type
TGenericClass<T: TItem> = class
private
type
D = class(TItem); // Proxy to get your T into and object list
private
SimpleList: TList<T>;
ObjectList: TObjectList<D>; // Compiles now, but there is that type issue
public
procedure Add(Item: T); // No direct access to ObjectList
end;
Добавить является примером того, как получить доступ к списку объектов. Оказывается, вы можете передать Item в ObjectList.Add без каких-либо проблем:
procedure TGenericClass<T>.Add(Item: T);
begin
ObjectList.Add(Item);
end;
Я думаю, что это может быть ошибкой, поэтому, чтобы защитить себя от исправления:
procedure TGenericClass<T>.Add(Item: T);
var
Obj: TObject;
begin
Obj := Item;
ObjectList.Add(D(Obj));
end;
Однако, учитывая ваш сценарий, я бы сказал, что TObjectList вполне может подойти.