gpt4 book ai didi

delphi - 在create中继承之前初始化成员字段可以吗?

转载 作者:行者123 更新时间:2023-12-03 14:51:32 25 4
gpt4 key购买 nike

在create中调用inherited之前初始化成员字段可以吗?

IE:

constructor TMyObject.create(AOwner: TComponent);
begin
fMyField := xxx;
inherited
end;

而不是正常的方式:

constructor TMyObject.create(AOwner: TComponent);
begin
inherited
fMyField := xxx;
end;

只是想知道他们有什么我没有看到的缺点......

最佳答案

当类的实例被实例化时,内存被分配并默认初始化(例如用零填充),然后调用构造函数。因此,构造函数中的任何代码都会在默认初始化之后执行,这将是您可能想象到会破坏您正在做的事情的一个计时问题。

但是,像您这样的代码通常表明存在更深层次的设计问题。在调用继承的构造函数之前是否初始化了一个值有什么关系呢?我可以想象您可能会因为两个原因而这样做:

  1. 如果相关字段是在派生类中声明的,则祖先代码访问它的唯一方法是调用虚拟(或动态)方法。在构造函数中这样做是危险的,因为仅创建了部分对象。这是一种很大的有毒代码气味。

  2. 如果相关字段是在祖先类中声明的,则您可能会使用此机制实际上将参数从派生类传递到祖先类。这是一种相当奇怪的做法。更合适的方法是在构造函数中使用参数。

关于delphi - 在create中继承之前初始化成员字段可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46112770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com