首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在过程中将类引用(元类)作为参数传递?

如何在过程中将类引用(元类)作为参数传递?
EN

Stack Overflow用户
提问于 2021-10-12 15:16:40
回答 1查看 244关注 0票数 1

有两个对象:TFooTFoo2

还有一个类引用:TFooClass = class of TFoo;

两者都是TPersistent的后代。

他们有自己的建设者:

代码语言:javascript
复制
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'

下面是一个很好的过程:

代码语言:javascript
复制
procedure Conjure(AClassName:string);
var
  PClass : TPersistentClass;
  p :TPersistent;
begin
  PClass := TPersistentClass(FindClass(AClassName))
  p := TFooClass(PClass).Create;  // <-- here is called appropriate constructor  
end;

现在,我希望有类似的对象,如:TBobodoTBobodo2

当然还有一个类参考资料:TBobodoClass = class of TBobodo;

等等..。

现在,如何将类引用作为参数传递到过程中,以确保调用正确的构造函数?

代码语言:javascript
复制
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;

有可能吗?

EN

回答 1

Stack Overflow用户

发布于 2021-11-04 14:47:22

我也遇到了同样的问题,经过一番挣扎,我找到了一个非常简单的解决方案:元类正是为此目的而发明的!在您的示例中,您可以将元类作为参数传递并直接使用它,而无需繁琐的查找类和类型转换。

代码语言:javascript
复制
type
  TFooClass = class of TFoo;

procedure Conjure(aFooClass : TFooClass); // <-- something like that 
var
  p :TPersistent;
begin
  p := aFooClass.Create;  // it will work!
end;

通过调用,您只需使用:

代码语言:javascript
复制
Conjure(TFoo); // <- for Foo class or
Conjure(TFoo2); // <- for Foo2 class and so on
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69543048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档