Delphi 7:创建未知对象的新实例

5

我有一个指向未知类实例的TObject引用。我该如何调用该未知类的构造函数以创建另一个实例?我知道Delphi具有RTTI,但不清楚如何使用。


1
https://dev59.com/inA75IYBdhLWcg3w3M9e - Ken White
1
@Ken:这是针对Delphi 7的,它不支持扩展RTTI。这是在D2010中添加的。 - Remy Lebeau
简短的回答是你不能这样做。 - David Heffernan
1个回答

10
无法构造未知类型的对象。编译器必须在编译时知道正确的类类型,以便生成适当的代码。如果构造函数需要参数怎么办?有多少个参数?数据类型是什么?它们是通过堆栈还是寄存器传递的?这些信息很重要。
话虽如此,如果所涉及的类都是从具有虚拟构造函数的公共基类派生出来的,那么仅在该情况下才能构造这样的对象。您可以使用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并实例化它来工作。 - Disillusioned

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接