为通用对象列表创建对象

Bir*_*ger 5 delphi oop generics

我不确定这在 Delphi 中是否可行。我环顾四周,似乎找不到答案(例如,不可能的示例或提示):

我有一个泛型列表类,我想创建一个泛型类型的实例。例如:

type
  TTypeA = class(TObject);

procedure Test;
var
  MyList: TobjectList<TTypeA>;
  NewListObject: TTypeA;
begin
  MyList := TObjectList<TTypeA>.Create;
  NewListObject := MyList.xxx //what to put on the xxx
end;
Run Code Online (Sandbox Code Playgroud)

是否可以创建一个函数 xxx 来创建 TTypeA 类型的新对象?

@jeroen:感谢下面的回答。但是,我忘记了问题中的一个重要细节:

我希望此代码也适用于任何其他类型,因此无需事先了解 TObjectList 的类型 T。我可能会创建以下列表:

MyList: TObjectList<TCar>;
MyList: TObjectList<TBike>;
Run Code Online (Sandbox Code Playgroud)

在不知道 MyList 是否包含 TCar 或 TBike(都从相同的基类和相等的构造函数派生)的情况下,我想向 MyList 添加一个新项目。

根据 Uwe Raabe 的建议,我遇到了下一个问题:

我修改了我的班级

TMyObjectList<T:class, constructor> = class(TMyBaseObjectList<T>)

其中 TMyBaseObjectList 定义为

TMyBaseObjectList<T:TMyBaseObject> = class(TObjectList)

现在我收到一个错误:类型参数 'T' 与类型 'T:TMyBaseObject' 不兼容

Uwe*_*abe 3

既然你知道类型,为什么不直接写

NewListObject := TTypeA.Create;
MyList.Add(NewListObject);
Run Code Online (Sandbox Code Playgroud)

这将是这里自然而然的做法。(我刚刚收到杰罗恩的类似回答通知)

如果您希望容器创建对象,则必须创建一个对泛型类型有更多了解的后代类才能创建实例。构造函数约束在这里可能会有所帮助。

type
  TMyObjectList<T:class, constructor> = class(TObjectList<T>)
  public
    function NewObject: T;
  end;

function TMyObjectList<T>.NewObject: T;
begin
  result := T.Create;
end;
Run Code Online (Sandbox Code Playgroud)

注意:只有当实际类型具有名为Create 的无参数构造函数时,这才有效。

更新:这会有所帮助

  TMyObjectList<T:constructor, TMyBaseObject> = class(TObjectList<T>)
  public
    function NewObj: T;
  end;
Run Code Online (Sandbox Code Playgroud)