大致代码如下:
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方法,所以没有实现。请问这个功能如何实现
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方法,所以没有实现。请问这个功能如何实现
解决方案 »
- 请问ftBCD和ftCurrency 这两个类型有什么不同?
- 请教一个DataSource1追加到另一个DataSource
- 求助 使用接口的写法??
- 请问如何做到这样加密的效果
- 关于ADO的问题(等着回答,分不够再给^_^)
- 怎么样禁止输入重复记录呢?
- 请问delphi中利用什么可以实现类似VBA的功能?
- 程序发布之后到了用户的电脑上界面却变得面目全非,不知何故!
- delphide的dbgrid问题?
- 研究了1天,也不知道如何解决:FastReport转PDF乱码
- 急急急!!关于Delphi7+intraweb控件,基于B/S结构,对Mysql数据库表进行数据操作!
- cxgrid中checkbox列,如何判断该列是否选中
item:=aclass.Create;
var
a: TTestClass;
begin
a := TTestClass.Create(TStringList);
writeln(a.Item.ClassName);
end;
var
a: TTestClass;
begin
a := TTestClass.Create(TStringList);
writeln(a.Item.ClassName);
end;
我用tstringbuilder试了一下,虽然classname可以显示出“tstringbuilder”,但是一旦append,就会报错list capacity out of bounds的错误, 就像没有创建成功一样
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');
突然想起来,我测试过,如果传入tstringbuilder,那么fclass和tstringbuilder的指针地址是一样的,也就说其实fclass已经指向了tstringbuilder的vmt,按道理说应该可以实现的。只不过直接fclass.create,是不是编译器不能分辨到底我是想生成tobject的实例还是tstringbuilder的实例,所以没成功。
constructor TTestClass.Create(aclass:TClass);
begin
inherited Create;
fclass:=aclass;
if aclass = TStringBuilder then
Item := TStringBuilder.Create
else // 其他类型逐一判断
Item := aclass.Create;
end;