如果我写
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/