当前位置 : 主页 > 编程语言 > delphi >

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

来源:互联网 收集:自由互联 发布时间:2021-06-23
如果在我的自定义构造函数中我不直接调用继承但是我调用’普通’构造函数,这没关系吗? 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的评论让我问这个“总结”的问题:是什么让构造函数成为构造函数?
事实上,它以关键字构造函数或它调用继承的方式开始(在父对象中调用构造函数)?

是的,这是完全可以接受的.事实上,在这种情况下,在新的构造函数中调用继承的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;不会发生.

网友评论