消息关闭
    暂无新消息!

关于动态生成类实例的问题

问题作者 : Grayley2017-07-19发布
大致代码如下:
type
TTestClass = class(TObject)
private
  fclass:TClass;
public
  item:TObject;
  constructor create(aclass:TClass);

implementation

constructor TTestClass.Create(aclass:TClass);
begin
    fclass:=aclass;
    item:=fclass.Create;
end;
 本意是想在使用这个类时,传入不同的类型,比如tstringbuilder等,自动生成对象,但是运行结果item都是空的,跟踪fclass.Create;发现调用的是tobject.create,而不是tstringbuilder的create方法,所以没有实现。请问这个功能如何实现

6个回答

︿ 3
我试了一下,确实有你说的问题,调试发现是TStringBuilder.Create;没有执行(虽然实例确实建立了),FMaxCapacity没有被初始化,还是0,一Append就超出限制了。所以看来用 item:=fclass.Create;直接创建实例是有问题的(对于有初始化类成员的类)。
︿ 1
稍微研究一下,Item := aclass.Create;这实际上是调用了TStringBuilder.NewInstance;来创建实例(如果传入的是TStringBuilder的话),并没有调用TStringBuilder.Create;
︿ 0
如果可以从传入的aclass获得实际类的构造函数地址,比如TStringBuilder.Create; 那还是有希望通过传入的类引用创建正确的实例,关键是通过RTTI能否得到某个类的构造函数(也是方法)的地址?需要研究一下(我看到以前borland newsgroup的帖子说不可以)。
︿ 0
即便你用item:=fclass.Create; 使用item的时候还是要判断一下是什么类实例,然后再cast或者用as操作,所以创建实例的时候判断一下也不是什么大问题,比如:
constructor TTestClass.Create(aclass:TClass);
begin
  inherited Create;
  fclass:=aclass;
  if aclass = TStringBuilder then
    Item := TStringBuilder.Create
  else  // 其他类型逐一判断
    Item := aclass.Create;
end;