TMyBaseClass=class
constructor(test:integer);
end;
TMyClass=class(TMyBaseClass);
TClass1<T: TMyBaseClass,constructor>=class()
public
FItem: T;
procedure Test;
end;
procedure TClass1<T>.Test;
begin
FItem:= T.Create;
end;
var u: TClass1<TMyClass>;
begin
u:=TClass1<TMyClass>.Create();
u.Test;
end;
我如何使它创建类与整数参数。解决方法是什么?
6条答案
按热度按时间cpjpxq1n1#
只需要类型转换到正确的类:
另外,使构造函数为虚拟的可能是一个好主意。
z3yyvxxp2#
你可以考虑给基类一个显式的初始化方法,而不是使用构造函数:
当然,只有当基类和所有子类都在你的控制之下时,这才有效。
lzfw57am3#
更新
@TOndrej提供的解决方案远远上级我下面写的,除了一种情况。如果您需要在运行时决定创建什么类,那么下面的方法似乎是最佳解决方案。
我已经刷新了我自己的代码库的记忆,它也处理这个确切的问题。我的结论是,你想要达到的是不可能的。如果有人想接受挑战,我很乐意被证明是错的。
我的解决方法是让泛型类包含一个类型为
class of TMyBaseClass
的字段FClass
。然后我可以用FClass.Create(...)
调用我的虚拟构造函数。我在Assert中测试了FClass.InheritsFrom(T)
。这都是令人沮丧的非通用性。就像我说的,如果有人能证明我的信念是错误的,我会投赞成票,删除,并高兴!在您的设置中,解决方法可能如下所示:
如果可能的话,另一个更优雅的解决方案是使用无参数构造函数,并在
T
的虚方法中传递额外的信息,可能称为Initialize
。kpbpu0084#
在 Delphi XE中,似乎是先调用T.Create,然后调用类特定的Create作为方法。这类似于Rudy Velthuis的回答(已删除),尽管我没有引入重载构造函数。如果T是TControl或类似的类,这个方法似乎也能正常工作,所以你可以用这种方式构造可视化控件。
我不能在 Delphi 2010上测试。
qpgpyjmq5#
zsbz8rwp6#
尽管这个问题已经很老了,但我没有看到任何人提出一个更简单的答案,所以我的贡献就在这里。
确保你的构造函数是虚拟的。没有必要进行类型转换。