delphi - 类类型和构造函数调用

标签 delphi delphi-2009

如果我写

type
  MyClass = class of TMyClass;
...
Obj := MyClass.Create;

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

如果我写

var
  ClassVar : TClass;
...
ClassVar := TMyClass;
Obj := ClassVar.Create;

仅调用 TObject 构造函数。

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

最佳答案

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

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

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

  TMyClass = class of TMyBaseObject;

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

关于delphi - 类类型和构造函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1239248/

相关文章:

macos - 如何在 Windows 机器的 ssh session 下签署 macOS 上的 Delphi 应用程序?

arrays - 将动态数组类型分配给 TArray<T> 变量

delphi - 获取 IDispatch 接口(interface)成员的访问权限

delphi - cxGrid 按 Enter 键将行高扩展到新行

delphi - delphi 如何在类中定义类?

delphi - 指向泛型类型的指针

delphi - 如何在不使用 alClient 对齐的情况下调整 TGridPanel 内 TEdit 的大小

delphi - inet_addr 对于 localhost 返回 -1

delphi - 是否可以在任务之间发送消息(OmniThreadLibrary)?

string - delphi 2009转换为字符串长度2