如果在我的自定义构造函数中我不直接调用继承但是我调用'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的评论让我问这个'总结'的问题:是什么让构造函数成为构造函数?
事实上它以关键字构造函数或它调用继承的方式开始(在父对象中调用构造函数)?
答案 0 :(得分:1)
是的,它完全可以接受。实际上,在这种情况下,在新构造函数中调用inherited Create
会很糟糕,并且会让您面临被子类被覆盖的构造函数被调用的风险。
假设一个层次结构:TSubContainer = class(TContainer)= class(TNGContainer):
当你编写它(这是正确的)时,当你的新构造函数被调用时,步骤的顺序如下:
如果您改为调用继承的Create,则步骤顺序如下:
请注意,TSubContainer.Create;
和TContainer.Create;
中 应该 完成的任何工作都不会发生。