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的调用,该调用是虚拟的.确保所有派生类都覆盖基本构造函数,并且最终会在运行时调用正确的类.
| 归档时间: |
|
| 查看次数: |
363 次 |
| 最近记录: |