Delphi从TObject继承Create

Alb*_*ssi 5 delphi

情况

这个问题可能很容易,但我是Delphi的新手,我现在正在研究它.为了更好地理解类,我做了一个计算二次方程的解.这是代码:

type
 TArrayOfStrings = array of string;

type
 TEqSecGrado = class(TObject) sealed
  private
   a, b, c: double;
   delta: double;
   solutions: TArrayOfStrings;
   function getDelta(vala, valb, valc: double): double; overload;
  public
   constructor Create(a, b, c: double);
   function getDelta: double; overload;
   function getSolutions: TArrayOfStrings; virtual;
 end;
Run Code Online (Sandbox Code Playgroud)

这确实很容易,但我想专注于constructor.


从我正在阅读的书中我知道(即使(TObject)不需要)我的类实际上是TObject的子类.因此,我可以Create默认调用没有参数的构造函数.我的问题是:

constructor TEqSecGrado.Create(a, b, c: double);
begin
 //inherited; -> is it needed?
 Self.a := a;
 Self.b := b;
 Self.c := c;
 delta := 0;
end;
Run Code Online (Sandbox Code Playgroud)

我需要打电话inherited吗?我已经研究过,使用我刚才提到的关键字,我将Create在我的类中"复制" TObject中构造函数的行为.我需要确保创建对象,但是我还需要为我的参数设置默认值.

由于它没有得到很好的解释,我还没有理解我必须使用的时间inherited.在这种情况下我应该这样做吗?

Dsm*_*Dsm 16

如果您知道父对象是TObject,则不严格需要继承.(如果你看一下TObject的构造函数,它就是空的).然而,在我看来不要调用继承的构造函数是不好的做法,原因有几个,我稍后会概述.但首先,如何调用继承的构造函数是这样的

constructor TEqSecGrado.Create(a, b, c: double);
begin
 inherited Create; // Note that we need to explicitly write "Create" here because it doesn't have the same parameters as our "Create"
 Self.a := a;
 Self.b := b;
 Self.c := c;
 delta := 0;
end;
Run Code Online (Sandbox Code Playgroud)

但是如果继承的构造函数为空,为什么我们需要调用它?

这一切都与维护有关,当我们忘记了我们做了什么以及为什么这样做时,六个月后会发生什么.

首先,我们可能决定重构和继承TObject以外的东西.如果我们现在包含了继承的构造函数,要么它以后仍然有效,否则编译器会告诉我们需要做些什么.

其次,我们不控制TObject,Delphi编译器编写器.可能是将来TObject.Create不是空的.想象一下,必须通过我们所有的构造函数来添加继承的!当然,所有那些认为浪费时间的程序员都会哗然,所以它永远不会发生.大概.