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

解决方案 »

  1.   

    item:=fclass.Create;这样当然不行,要:
    item:=aclass.Create;
      

  2.   

    (fClass.NewInstance).Create()
      

  3.   

    这样好像也不行,在create之前,item是nil,create之后,item虽然不是nil了,但是鼠标移动上去看,是(),似乎也没有成功。
      

  4.   

    好像这样也不行可以的。
    var
      a: TTestClass;
    begin
      a := TTestClass.Create(TStringList);
      writeln(a.Item.ClassName);
    end;
      

  5.   

    好像这样也不行可以的。
    var
      a: TTestClass;
    begin
      a := TTestClass.Create(TStringList);
      writeln(a.Item.ClassName);
    end;
    我用tstringbuilder试了一下,虽然classname可以显示出“tstringbuilder”,但是一旦append,就会报错list capacity out of bounds的错误, 就像没有创建成功一样
      

  6.   

    好像这样也不行可以的。
    var
      a: TTestClass;
    begin
      a := TTestClass.Create(TStringList);
      writeln(a.Item.ClassName);
    end;
    我用tstringbuilder试了一下,虽然classname可以显示出“tstringbuilder”,但是一旦append,就会报错list capacity out of bounds的错误, 就像没有创建成功一样
    使用的代码是TStringbuilder(a.item).Append('122');
      

  7.   

    我试了一下,确实有你说的问题,调试发现是TStringBuilder.Create;没有执行(虽然实例确实建立了),FMaxCapacity没有被初始化,还是0,一Append就超出限制了。所以看来用 item:=fclass.Create;直接创建实例是有问题的(对于有初始化类成员的类)。
      

  8.   

    那这个功能该如何实现,求教,由于我的类是直接继承的tobject,可能不能使用getclass和findclass
      

  9.   

    那这个功能该如何实现,求教,由于我的类是直接继承的tobject,可能不能使用getclass和findclass
    突然想起来,我测试过,如果传入tstringbuilder,那么fclass和tstringbuilder的指针地址是一样的,也就说其实fclass已经指向了tstringbuilder的vmt,按道理说应该可以实现的。只不过直接fclass.create,是不是编译器不能分辨到底我是想生成tobject的实例还是tstringbuilder的实例,所以没成功。
      

  10.   

    即便你用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;
      

  11.   

    稍微研究一下,Item := aclass.Create;这实际上是调用了TStringBuilder.NewInstance;来创建实例(如果传入的是TStringBuilder的话),并没有调用TStringBuilder.Create;
      

  12.   

    如果可以从传入的aclass获得实际类的构造函数地址,比如TStringBuilder.Create; 那还是有希望通过传入的类引用创建正确的实例,关键是通过RTTI能否得到某个类的构造函数(也是方法)的地址?需要研究一下(我看到以前borland newsgroup的帖子说不可以)。