首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >德尔福从TObject继承创建

德尔福从TObject继承创建
EN

Stack Overflow用户
提问于 2016-08-19 21:08:24
回答 1查看 3.6K关注 0票数 6

SITUATION

这个问题可能很容易,但我是新来的德尔菲,我现在正在研究它。为了更好地理解类,我做了一个计算二阶方程解的方法。这是代码:

代码语言:javascript
复制
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。我的问题是:

代码语言:javascript
复制
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吗?我已经研究过,使用我刚才提到的关键字,我将在我的类中“复制”Create构造函数在TObject中的行为。我需要确定地创建对象,但也需要为参数设置默认值。

因为它没有很好的解释,所以我还没有理解我什么时候必须使用inherited。在这种情况下我应该这么做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-19 21:34:36

如果您知道父级是TObject,则严格地不需要继承。(如果您查看TObject的构造函数,它是空的)。但是,在我看来,不调用继承的构造函数是错误的做法,原因有几点,我稍后将介绍。但是首先,如何调用继承的构造函数如下所示

代码语言:javascript
复制
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;

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

这一切都与维护有关,当我们忘记了我们做了什么和为什么做的时候,六个月后会发生什么。

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

其次,我们不控制TObject,Delphi编译器编写人员做。在未来,TObject.Create可能并不是空的。想象一下,必须遍历所有的构造函数才能在其中添加继承的构造函数!当然,所有那些认为这是浪费时间的程序员都会大声疾呼,所以这永远不会发生。可能吧。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39047698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档