如果在我的自定义构造函数中我不直接调用继承但是我调用’普通’构造函数,这没关系吗? TContainer = Class(TNGContainer) private FEncoding: TMyEncoding; protected public constructor Create; overload; overri
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的评论让我问这个“总结”的问题:是什么让构造函数成为构造函数?
事实上,它以关键字构造函数或它调用继承的方式开始(在父对象中调用构造函数)?
假设一个层次结构: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;不会发生.