Delphi 7:创建一个未知对象的新实例
答
您不能构造未知类型的对象。编译器必须在编译时知道正确的类类型,才能生成正确的代码。如果构造函数需要参数呢?多少?什么数据类型?他们是通过堆栈还是注册?这些信息很重要。这就是说,如果有问题的类都是从具有虚拟构造函数的公共基类派生的,则THEN和ONLY THEN可以构造这样的对象。您可以使用TObject.ClassType()
方法获取对现有对象类类型的引用,并将其类型转换为基类类型,然后调用构造函数。例如:
type
TBase = class
public
constructor Create(params); virtual;
end;
TBaseClass = class of TBase;
TDerived1 = class(TBase)
public
constructor Create(params); override;
end;
TDerived2 = class(TBase)
public
constructor Create(params); override;
end;
...
var
NewObj: TBase;
begin
if SomeObj is TBase then
NewObj := TBaseClass(SomeObj.ClassType).Create(params);
end;
+2
值得一提的是,这是'TComponent'工作的基本方式。只要你有ClassType(比如X),你就可以调用'TComponentClass(X).Create(...)'。 DFM流式传输通过查找在DFM中为特定类名称注册的ClassType并按以上实例化来工作。 – 2014-11-07 16:09:22
http://*.com/q/3068775 – 2014-11-06 17:55:49
@Ken:这是为Delphi 7,其不支持扩展RTTI。这是在D2010中添加的。 – 2014-11-06 18:00:11
简单的答案是你不能这样做。 – 2014-11-06 19:05:43