在TObject的“Create”构造函数中继承使用

时间:2009-04-21 12:31:44

标签: delphi

我应该在从TObject或TPersistent派生的类的构造函数中调用“inherited”吗?

constructor TMyObject.Create;
begin
 inherited Create;   // Delphi doc: Do not create instances of TPersistent. Use TPersistent as a base class when declaring objects that are not components, but that need to be saved to a stream or have their properties assigned to other objects.    
 VectorNames := TStringList.Create;
 Clear;
end;

4 个答案:

答案 0 :(得分:39)

是。它什么都不做,是的,但它是无害的。我认为总是调用继承的构造函数是一致的,而不检查实际上是否存在实现。有人会说,值得调用继承的Create,因为Embarcadero将来可能会为TObject.Create添加一个实现,但我怀疑这是真的;它会破坏不调用继承Create的现有代码。尽管如此,我认为仅仅因为一致性而称它为一个好主意。

答案 1 :(得分:13)

我总是这样做。

如果要重构并将代码移动到共同的祖先,则调用继承的Create具有以下优点:

  1. 如果共同的祖先有一个构造函数,你就不能忘记调用它。
  2. 如果共同的祖先有一个具有不同参数的构造函数,编译器会向您发出警告。

答案 2 :(得分:2)

您也可以覆盖“procedure AfterConstruction”。无论何种构造函数,都始终调用此过程。

public
  procedure AfterConstruction; override;
end;

procedure TfrmListBase.AfterConstruction;
begin
  inherited;
  //your stuff, always initialized, no matter what kind of constructor!
end;

例如:如果要创建一个具有与普通TObject.Create不同的构造函数的对象,例如TComponent.Create(AOwner)或自定义(重载)构造函数,则可能会出现问题,因为未调用覆盖和(在这种情况下)你的“VectorNames”变量将为零。

答案 3 :(得分:2)

我称之为,除非我需要一个非常优化的构造函数。