gpt4 book ai didi

delphi - 为通用对象列表创建对象

转载 作者:行者123 更新时间:2023-12-03 15:31:28 25 4
gpt4 key购买 nike

我不确定这在 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;

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

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

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

MyList: TObjectList<TCar>;
MyList: TObjectList<TBike>;

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

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

我将我的类(class)修改为

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

其中 TMyBaseObjectList 定义为

TMyBaseObjectList<T:TMyBaseObject> = class(TObjectList)

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

最佳答案

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

NewListObject := TTypeA.Create;
MyList.Add(NewListObject);

这将是这里的自然方式。 (我刚刚收到 Jeroen 的类似回答通知)

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

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

function TMyObjectList<T>.NewObject: T;
begin
result := T.Create;
end;

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

更新:这会有所帮助

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

关于delphi - 为通用对象列表创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3421953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com