关于oop:如果没有显式调用,Delphi调用是否在覆盖的过程中继承

关于oop:如果没有显式调用,Delphi调用是否在覆盖的过程中继承

Does Delphi call inherited on overridden procedures if there is no explicit call

如果代码中没有显式调用,Delphi是否会在覆盖的过程中调用继承,即(继承;),我具有以下结构(从超类到子类)

TForm >> TBaseForm >> TAnyOtherForm

项目中的所有表单都将从TBaseForm派生,因为它将具有用于每种表单(安全性,验证等)的所有标准设置和破坏性部分。

TBaseForm的代码具有onCreate和onDestroy过程,但是如果有人(例如我)忘记在TAnyOtherForm上将继承的onCreate添加到onCreate上,Delphi会为我调用吗? 我在网上找到了引用,说它不是必需的,但是如果代码中省略了它,则没有地方说它是否被调用。

另外,如果它确实为我调用了继承的功能,那么它将何时调用它?


不,如果您将调用保留为继承,它将不会被调用。否则,将无法覆盖方法并完全省略其父版本。


值得一提的是,不调用Destroy中继承的任何对象都可能导致内存泄漏。在源代码中有可用的工具来检查这一点。


必须显式进行继承的调用。通常,在等效情况下(不包括类构造函数),没有语言会自动调用继承的函数。

很容易忘记在类构造函数中进行继承的调用。在这种情况下,如果基类需要初始化任何数据,则将发生访问冲突。

也许您可以在TBaseForm类中重写DoCreate和DoDestory,以便确保无论子类的实现如何,都可以执行某些代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// interface

TBaseForm = Class(TForm)
...
Protected
    Procedure DoCreate(Sender : TObject); Override;
End

// implementation

Procedure TBaseForm.DoCreate(Sender : TObject);
Begin
    // do work here

    // let parent call the OnCreate property  
    Inherited DoCreate(Sender);
End;

必须在后代对象以及可视形式继承中显式调用Inherited。如果您使用类完成,那么如果您将该定义标记为重写,则它将自动添加继承的内容(但不是为了重新引入)。如果您使用的是可视表单继承,则当您通过表单编辑器添加新的事件处理程序时,它也会添加继承的事件处理程序。


正如其他人所指出的那样,继承的代码不是隐式调用的。您必须显式调用它。这为您提供了一些有用的灵活性。例如,您可能想要在继承的代码之前做一些预处理代码,然后再做一些后处理代码。可能看起来像:

1
2
3
4
5
6
procedure TMyCalcObject.SolveForX;
begin
  ResetCalcState;
  inherited SolveForX;
  PostProcessSolveForX;
end;

您必须显式调用它。这可以提供很大的灵活性,因为您可以选择在代码中的哪个位置调用继承的方法。但这也是错误的重要来源。忘记调用继承的函数很容易,并且编译器无法告诉您是故意还是忘记了。

应该有某种指令" skip_inherited"来告诉编译器您不想调用继承的方法。

如果找不到"继承"或" skip_inherited",编译器将很容易报告错误。那意味着你忘记了。但不幸的是,CodeGear中没有人想到这一点。


不,这是压倒一切的重点。


推荐阅读

    脚本调用linux命令?

    脚本调用linux命令?,代码,系统,工作,底部,脚本,位置,环境,行用,官网,标准,typ

    调用函数命令linux?

    调用函数命令linux?,系统,管理,网络,通用,统一,观察,地址,代码,设备,地方,怎

    linux拷贝覆盖命令?

    linux拷贝覆盖命令?,系统,文件,信息,命令,目录,时间,基本知识,项目,数据,源

    linux内核总调用命令?

    linux内核总调用命令?,工作,地址,系统,信息,管理,策略,命令,目录,时间,基础,

    linux编程调用命令?

    linux编程调用命令?,系统,标准,管理,工作,基础知识,情况,环境,设备,基础,首

    linux命令窗口调用?

    linux命令窗口调用?,系统,工具,首页,终端,命令,数据,盘中,代码,密码,快捷键,

    linux服务器调用命令?

    linux服务器调用命令?,系统,地址,设备,标准,工作,密码,中心,盘中,网络,软件,

    linuxc调用命令框?

    linuxc调用命令框?,系统,工作,标准,情况,设备,环境,命令,函数,语言,程序,如何

    linux系统调用命令行?

    linux系统调用命令行?,系统,网络,代码,密码,位置,工作,通用,平台,电脑,环境,

    批量调用linux命令?

    批量调用linux命令?,工具,下来,软件,系统,密码,地址,时间,认证,向日葵,文件,l

    linux内核调用命令?

    linux内核调用命令?,系统,工作,信息,工具,内核,命令,名称,标准,流程,网络,在l

    linux内核态调用命令?

    linux内核态调用命令?,系统,密码,名称,代码,状态,异常,内核,工作,服务,数据,

    linuxrz命令覆盖?

    linuxrz命令覆盖?,数据,服务,软件,工具,文件,命令,位置,名字,系统,目录,如何

    linux命令调用记录?

    linux命令调用记录?,信息,系统,名称,地址,时间,数据,命令,服务,环境,用户,lin

    linux调用编辑命令行?

    linux调用编辑命令行?,工作,状态,系统,命令,模式,数字,代码,首开,第一,管理,l

    python调用dll

    python调用dll,代码,培训,接口,定义,缓冲区,文件,方法,指针,长度,类型,在pyt

    调用 Python 解释器

    调用 Python 解释器,标准,系统,位置,情况,状态,培训,数据,设备,文件,脚本,Py