状况
这个问题可能很容易,但我是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;
这确实很容易,但我想专注于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;
我需要拨打inherited
吗?我已经研究过,使用我刚才提到的关键字,我将要复制"复制"我的类中TObject中Create
构造函数的行为。我需要确保创建对象,但是我还需要为我的参数设置默认值。
由于它没有得到很好的解释,我不知道何时必须使用inherited
。在这种情况下我应该这样做吗?
答案 0 :(得分:16)
如果您知道父对象是TObject,则不严格需要Inherited。 (如果你看一下TObject的构造函数,它就是空的)。然而,在我看来不要调用继承的构造函数是不好的做法,原因有几个,我稍后会概述。但首先,如何调用继承的构造函数就像这样
constructor TEqSecGrado.Create(a, b, c: double);
begin
inherited Create; // Note that we need to explicitly name create here because it does not hae the same parameters as our create
Self.a := a;
Self.b := b;
Self.c := c;
delta := 0;
end;
但是如果继承的构造函数为空,为什么我们需要调用它?
这完全与维护有关,当我们忘记了我们做了什么以及为什么这样做时,六个月后会发生什么。
首先,我们可能决定重构和继承TObject以外的东西。如果我们现在包含了继承的构造函数,要么它以后仍然有效,否则编译器会告诉我们我们需要做些什么。
其次,我们不控制TObject,Delphi编译器编写器。可能是将来TObject.Create不是空的。想象一下,必须通过我们所有的构造函数来添加继承的!当然,所有那些认为浪费时间的程序员都会哗然,所以它永远不会发生。可能。