2014-11-06 72 views
4

我有一个TObject引用了一个未知类的实例。我如何调用这个未知类的构造函数来创建它的另一个实例?我知道德尔福有RTTI,但不清楚如何使用它。Delphi 7:创建一个未知对象的新实例

+1

http://stackoverflow.com/q/3068775 – 2014-11-06 17:55:49

+1

@Ken:这是为Delphi 7,其不支持扩展RTTI。这是在D2010中添加的。 – 2014-11-06 18:00:11

+0

简单的答案是你不能这样做。 – 2014-11-06 19:05:43

回答

8

您不能构造未知类型的对象。编译器必须在编译时知道正确的类类型,才能生成正确的代码。如果构造函数需要参数呢?多少?什么数据类型?他们是通过堆栈还是注册?这些信息很重要。这就是说,如果有问题的类都是从具有虚拟构造函数的公共基类派生的,则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

相关问题