delphi - 必须在第一行调用继承?
问题描述
我见过这样的一段代码(不是我的)。作者在调用inherited之前在构造函数的第一行设置了FField。我很好奇这段代码是否有效。
TTest = class(TBaseObject, ITest)
private
protected
FField: TObject;
end;
constructor TTest.Create(aField: TObject);
begin
FField:= aField;
inherited Create();
...
end;
我认为 FField 的内存已经分配并在那时被取消了。正确的?
解决方案
代码有效。当您的构造函数运行时,实例已被分配并默认初始化。
在调用继承构造函数之前设置成员意味着如果继承构造函数访问该成员,它将读取调用派生构造函数提供的值。虽然继承的构造函数不能直接访问该成员,但在这种情况下,它可以通过调用虚拟方法来访问它。但是请注意,从构造函数调用虚方法是一种有点可疑的做法,因为实例可能是部分构造的。
推荐阅读
- css - 防止最大宽度跳跃的视频加载
- mysql - Laravel join 用于获得一对多关系?
- rust - 处理具有绑定生命周期的异步/未来响应?
- javascript - 为什么点表示法返回具有附加属性的对象,而扩展运算符不返回?
- logging - 停止写入 native_stderr.log 和 native_stdout.log websphere 应用服务器
- python - 对稍后创建的对象的引用
- ruby-on-rails - 为什么我的 rails 没有自动加载 app 文件夹?
- loops - 列表中每个项目的颤振调用函数
- python - 如何在解析电子邮件时修复 OLE 错误
- php - 使用主键从不同的表中获取字词