Oop 定义通用TObjectList<;T>;类型T在运行时确定

Oop 定义通用TObjectList<;T>;类型T在运行时确定,oop,delphi,Oop,Delphi,假设我有这样的课: TUserClass = class of TObject; TMyClass = class(TObject) private FUserList: TObjectList<TUserClass>; {compile error here} public constructor Create(AUserClass: TUserClass); end; TMyClass.Create(A

假设我有这样的课:

    TUserClass = class of TObject;

    TMyClass = class(TObject)
    private
      FUserList: TObjectList<TUserClass>; {compile error here}
    public 
      constructor Create(AUserClass: TUserClass);
    end;

    TMyClass.Create(AUserClass: TUserClass);
    begin
      inherited;

      FUserList := TObjectList<AUserClass>.Create;
    end;
TUserClass=TObject的类;
TMyClass=类(TObject)
私有的
FUserList:TObjectList;{此处编译错误}
公开的
构造函数创建(AUserClass:TUserClass);
结束;
创建(AUserClass:TUserClass);
开始
继承;
FUserList:=TObjectList.Create;
结束;
我希望TMyClass创建FUserList,而AUserClass在运行时确定。 现在我有了编译错误,正如我在代码中所示,“类型参数'T'必须是类类型”。
知道我该怎么做吗?

泛型实例化发生在编译时,因此您不能在运行时指定类型参数


至于做什么,这取决于你试图解决的问题

TMyClass,假定它适用于具有不同属性的两种类型的用户。我不想在TMyClass之外创建它的类。我仍然不知道如何给你建议。我想我回答了如何在运行时实例化泛型的问题。@AminAlinezhad听起来让TMyclass泛型就足够了。@DavidHeffernan是的,我知道,但我认为OP可能想得太多了。正如David所说,您不能在运行时定义泛型类。事实上,这样做毫无意义。您必须在设计时知道要处理什么,因为您不能在运行时设计类。因此,您必须知道在运行时处理的类。通常,您试图做的事情将通过简单地使用多态性来处理。您可以从一个公共基类派生类,并使用该基类的对象列表。那么你甚至不需要泛型。那么,您的案例有什么特别之处,使泛型成为可取的?