如果在我的自定义构造函数中不调用直接继承的函数,而是调用“正常”的构造函数,可以吗?
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;
我可以在第二个构造函数中调用继承,但是第一个构造函数具有很多初始化代码。因此,我将不得不在两个构造函数中重复此代码。在一个构造函数中修改初始化代码会很容易,而在另一个构造函数中却忘记这样做。
我逐行运行了代码,并以正确的顺序调用了构造函数。继承的(父)构造函数被正确调用。
彼得B的评论使我问这个“结论”问题:是什么使构造函数成为构造函数?
它是从关键字构造函数开始的事实还是它调用继承的事实(在父对象中调用构造函数)?
是的,完全可以接受。实际上,在这种情况下,调用inherited Create
新的构造函数会很不好,并使您面临以下风险:子类的重写构造函数在应有的时候不被调用。
假设层次结构:TSubContainer = class(TContainer)= class(TNGContainer):
如您所写(正确),在调用新构造函数时,步骤顺序如下:
如果您改为调用继承的Create,则步骤序列如下:
请注意,任何应在其中完成TSubContainer.Create;
且TContainer.Create;
不会发生的工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句