有两个对象: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;有可能吗?
发布于 2021-11-04 14:47:22
我也遇到了同样的问题,经过一番挣扎,我找到了一个非常简单的解决方案:元类正是为此目的而发明的!在您的示例中,您可以将元类作为参数传递并直接使用它,而无需繁琐的查找类和类型转换。
type
TFooClass = class of TFoo;
procedure Conjure(aFooClass : TFooClass); // <-- something like that
var
p :TPersistent;
begin
p := aFooClass.Create; // it will work!
end;通过调用,您只需使用:
Conjure(TFoo); // <- for Foo class or
Conjure(TFoo2); // <- for Foo2 class and so onhttps://stackoverflow.com/questions/69543048
复制相似问题