【发布时间】:2026-01-08 03:30:02
【问题描述】:
有两个对象:TFoo、TFoo2。
还有一个类引用:TFooClass = class of TFoo;
两者都是TPersistent的后代。
他们有自己的构造函数:
type
TFoo = class(TPersistent)
private
FC:Char;
public
constructor Create; virtual;
published
property C:Char read FC write FC;
end;
TFoo2 = class(TFoo)
public
constructor Create; override;
end;
TFooClass = class of TFoo;
...
constructor TFoo.Create;
begin
inherited Create;
C :=' 1';
end;
constructor TFoo2.Create;
begin
inherited Create;
C := '2';
end;
我想从一个字符串创建一个TFoo2 对象,这实际上是它的类名:'TFoo2'
这是程序,它工作正常:
procedure Conjure(AClassName:string);
var
PClass : TPersistentClass;
p :TPersistent;
begin
PClass := TPersistentClass(FindClass(AClassName))
p := TFooClass(PClass).Create; // <-- here is called appropriate constructor
end;
现在,我想要类似的对象,例如:TBobodo、TBobodo2。
当然还有一个类参考:TBobodoClass = class of TBobodo;
等等……
现在,如何将类引用作为参数传递给过程,以确保调用正确的构造函数?
procedure Conjure(AClassName:string; ACLSREF: ???? ); // <-- something like that
var
PClass : TPersistentClass;
p :TPersistent;
begin
PClass := TPersistentClass(FindClass(AClassName))
p := ACLSREF(PClass).Create; // <-- something like that
end;
有可能吗?
【问题讨论】:
-
使用虚拟构造函数从基类派生所有类,并且不需要传递类引用
-
是的,但我想用这种方式创建“低层次”对象,如 TFont、TPen 等....只是想知道,是否有一些可爱的解决方案
-
我想这取决于你是否想要一个有效的解决方案
-
@DavidHeffernan 我有例程,可以将 TPersistent 对象(和所有后代)保存并加载到 XML 中。唯一的弱点是一个过程,我必须显式使用类引用来创建类,这看起来很丑。
-
也许您可以使用
RegisterClass之类的方法,即创建基类名称到元类引用的映射。