【问题标题】:Is it mandatory to have Inherited on the first line, in a constructor?在构造函数的第一行是否必须继承?
【发布时间】:2018-03-21 13:37:29
【问题描述】:

在构造函数的第一行是否必须有 Inherited?
我可以在“继承”之前有其他代码吗?

例子:

constructor TMyIniFile.Create(SectionName: string);                                          
VAR Path: string;
begin
 Path:= UserProfileFolder;  //initialize path here

 inherited Create(Path);

 //more code ..
end;

【问题讨论】:

  • 我从未尝试过。我认为在调用inherited之前使用局部变量没有问题,但我认为你不能使用对象的字段。
  • 您可以这样做,但这通常是设计缺陷的标志。只有在基本构造函数中调用虚方法才有意义。你应该从构造函数中调用虚方法。
  • @David 那不应该是“应该打电话”吗?
  • 很久以前,TThread 实现中有一个错误,在某些情况下,您需要在构造函数中最后调用Inherited。即使可能,也不要将其作为一种习惯,因为这会使未来的维护者感到困惑。
  • @LURD:你提到的错误是当用ACreateSuspended=False调用基本构造函数时,它会立即开始运行线程,这样Execute()就可以在构造函数完成初始化之前开始运行TThread 对象。但是这个错误早在 Delphi 6 中就已经修复了。

标签: delphi delphi-xe7


【解决方案1】:

Delphi 的对象模型(与 C++ 对象模型相比)的优点之一是您(作为程序员)可以决定何时调用继承的构造函数。您在问题中显示的代码完全可以安全运行。

另外 - 您可以毫无问题地使用实例字段,即。

CONSTRUCTOR TSomeClass.Create;
  BEGIN
    FSomeInstanceField:=123;
    INHERITED Create;
  END;

这将调用继承的构造函数,它可以访问 FSomeInstanceField 变量的修改值。

【讨论】:

  • 当你这样做时,通常这是一个设计师缺陷的标志。
  • 您甚至可以将继承的代码排除在外,这并不是一个好主意。我必须同意@DavidHeffernan 的观点
猜你喜欢
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 2013-12-10
  • 2015-09-08
  • 1970-01-01
  • 2013-06-01
相关资源
最近更新 更多