【发布时间】:2016-12-27 03:01:08
【问题描述】:
情况
这个问题可能很简单,但我是 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。在这种情况下我应该这样做吗?
【问题讨论】:
-
如果我将继承的内容放入我的 Create 中,则会出现错误。我想看看其他人有什么建议
-
inherited;在带参数的构造函数中尝试调用具有相同超类参数的相同构造函数。那不存在,所以你得到一个错误。请改用inherited Create;。现在TObject.Create没有做任何事情,但如果有一天你决定从另一个类继承,它仍然有效。 -
inherit这个词总是从父类继承构造函数或其他方法。如果在父类中找不到这样的构造函数或方法,Delphi 会尝试在其父类等中搜索它。如果在任何父类中都找不到这样的构造函数或方法,则会引发错误。现在 -
@AlbertoRossi BTW 因为在您的最后两个问题中,您似乎使用的类仅包含一些代码,这些代码返回您可能想要检查类方法(docwiki.embarcadero.com/RADStudio/Seattle/en/Methods)和类字段的某些结果(docwiki.embarcadero.com/RADStudio/Seattle/en/Fields)。创建一个类只是为了做一些简单的计算然后销毁它不是最佳实践,因为类创建和类销毁会影响性能。通过使用类方法和类字段,您无需每次都创建类对象。
标签: delphi