在create中继承之前初始化成员字段是否可以?

时间:2017-09-08 09:10:23

标签: delphi

在create?

中调用inherited之前初始化成员字段是否可以

IE:

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

而不是正常的方式:

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

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

1 个答案:

答案 0 :(得分:11)

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

然而,像你这样的代码通常表示更深层次的设计萎靡不振。在调用继承的构造函数之前是否初始化值有什么关系?我可以想象有两个原因你可能想要这样做:

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

  2. 如果有问题的字段是在祖先类中声明的,那么您可能正在使用此机制实际上将派生类中的参数传递给祖先。这是一种相当奇怪的方式。更合适的方法是在构造函数中使用参数。