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

WeG*_*ars 21 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;
Run Code Online (Sandbox Code Playgroud)

Cra*_*ntz 39

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

  • 我认为最重要的原因是Gamecat所说的 - 在某些时候你可能想要将你的类从TObject重新定义为其他类,而新类可能包含非平凡的构造函数. (4认同)
  • IIRC,在调用构造函数(Create)之前已经分配了基本存储. (2认同)
  • mj2008,你是对的.Stijn,你错了.阅读来源! (2认同)
  • @Stijn,TObject的构造函数什么都不做,分配存储是由NewInstance完成的,由InitInstance初始化.TObject的两个类方法. (2认同)

Too*_*the 13

我总是这样做.

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

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

  • 虽然Craig是正确的,但这些也是我调用继承Create的主要原因,而不是一致的. (3认同)