创建自定义构造函数而不直接调用inherited

时间:2014-05-22 08:27:31

标签: delphi

如果在我的自定义构造函数中我不直接调用继承但是我调用'normal'构造函数,这没关系吗?

 TContainer = Class(TNGContainer)
  private
    FEncoding: TMyEncoding;
  protected
  public
    constructor Create;   overload;    override;
    constructor Create(Enc: TMyEncoding);  overload;
  end;


constructor TContainer.Create;     { 'normal' constructor }
begin
 inherited Create;
 Clear;
 BufMaxSeqLen       := 8*KB;
 FEncodingOffset    := 33;
 {More stuff to initialize here...}
end;


constructor TContainer.Create(Enc: TMyEncoding);    { New constructor }
begin
 Create;              { Call 'normal' constructor which will call Inherited }
 Encoding:= Enc;
end;

我可以在第二个构造函数中调用inherited但第一个构造函数有很多初始化代码。所以,我必须在两个构造函数中复制此代码。在一个构造函数中修改初始化代码很容易,而忘记在另一个构造函数中执行相同的操作。

我逐行运行代码,并以正确的顺序调用构造函数。正确调用继承的(父)构造函数。


Pieter B的评论让我问这个'总结'的问题:是什么让构造函数成为构造函数?
事实上它以关键字构造函数或它调用继承的方式开始(在父对象中调用构造函数)?

1 个答案:

答案 0 :(得分:1)

是的,它完全可以接受。实际上,在这种情况下,在新构造函数中调用inherited Create会很糟糕,并且会让您面临被子类被覆盖的构造函数被调用的风险。

假设一个层次结构:TSubContainer = class(TContainer)= class(TNGContainer):

当你编写它(这是正确的)时,当你的新构造函数被调用时,步骤的顺序如下:

  • TContainer.Create(Enc:TMyEncoding);
  • TSubContainer.Create;
  • TContainer.Create; (假设TSubContainer调用继承)
  • TNGContainer.Create;

如果您改为调用继承的Create,则步骤顺序如下:

  • TContainer.Create(Enc:TMyEncoding);
  • TNGContainer.Create;

请注意,TSubContainer.Create;TContainer.Create; 应该 完成的任何工作都不会发生。