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' 不兼容
既然你知道类型,为什么不直接写
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)
| 归档时间: |
|
| 查看次数: |
3084 次 |
| 最近记录: |