类类型和构造函数调用

jpf*_*ius 2 delphi delphi-2009

如果我写

type
  MyClass = class of TMyClass;
...
Obj := MyClass.Create;
Run Code Online (Sandbox Code Playgroud)

调用正确的构造函数(TMyClass中的构造函数).

如果我写

var
  ClassVar : TClass;
...
ClassVar := TMyClass;
Obj := ClassVar.Create;
Run Code Online (Sandbox Code Playgroud)

只调用TObject构造函数.

为什么?这两个版本有什么区别?我可以在第二种情况下强制执行TMyClass构造函数调用吗?

Mas*_*ler 11

TClass Class of TObject在system.pas中声明为" ".调用什么构造函数是在编译时决定的,所有编译器都知道你正在使用什么基类.它不知道变量运行时的值是什么,所以它必须默认为基类.如果您使用的是TClass,那么您的基类是TObject.

如果你正在使用一个类变量,我假设你有某种类型的heirarchy,你正在尝试实现一个工厂.如果要确保在运行时根据类变量的值调用正确的构造函数,而不是在编译时代码中包含的内容,则需要一个虚拟构造函数.

type
  TMyBaseObject = class(TObject)
  public
    constructor Create; virtual;
  end;

  TMyClass = class of TMyBaseObject;
Run Code Online (Sandbox Code Playgroud)

使用TMyClass而不是TClass作为类变量,现在编译器将生成对TMyBaseObject.Create的调用,该调用是虚拟的.确保所有派生类都覆盖基本构造函数,并且最终会在运行时调用正确的类.