【问题标题】:Delphi inherit Create from TObjectDelphi 从 TObject 继承 Create
【发布时间】: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。在这种情况下我应该这样做吗?

【问题讨论】:

  • 可能的重复:看看stackoverflow.com/questions/772336/…
  • 如果我将继承的内容放入我的 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


【解决方案1】:

如果您知道父对象是 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;

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

这完全与维护有关,以及当我们忘记我们做了什么以及为什么在六个月后会发生什么。

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

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

【讨论】:

  • 这正是我一直在寻找的,我将始终继承 Create 作为一个好习惯。谢谢你:)
  • @AlbertoRossi 是的,这是一个很好的做法,但您继承的类不必具有名为 Create 的构造函数。此外,当您从其他类继承时,父构造函数也可能期望将某些参数传递给其构造函数。如果您的构造函数具有相同的结构,则调用 inherited; 也会传递这些参数,但如果不是,则必须调用 inherited ParentConstructorName(Nedded parameters)
  • 确实,我只能输入 constructor CreateMyObject; 而从不使用实际的 Create - 但在 CreateMyObject 内调用 inherited Create;
猜你喜欢
  • 2020-03-17
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
  • 2010-10-20
相关资源
最近更新 更多