gpt4 book ai didi

delphi - 重写和非重写构造函数

转载 作者:行者123 更新时间:2023-12-03 14:57:53 24 4
gpt4 key购买 nike

我只是想问一个简单的问题 - 我有一个从 TLabel 派生的类,如下所示:

TMyLabel = class (TLabel)
...
constructor Create(AOwner: TComponent); override;
end;

constructor TMyLabel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
{ some code }
end;

现在,Delphi 允许我编译带有和不带有覆盖的两个版本。覆盖。您能解释一下这些差异是什么吗?除了在覆盖时无法在Create()中请求我自己的参数之外。谢谢

编辑:我的意思是 - 虚拟和非虚拟基派构造函数之间有什么区别?我总是可以通过inherited Create()调用继承的构造函数,那有什么意义呢?

最佳答案

虚拟构造函数允许对象的多态实例化。典型的例子是 Delphi 的 .dfm 流机制。

读取 .dfm 文件并实例化表单的代码在编译时不知道要使用哪些类。该决定被推迟到可以正确做出的运行时,即读取 .dfm 文件时。此外,您可以使用 .dfm 文件机制来创建不属于 VCL 的自定义组件,因此该 .dfm 机制必须能够正确实例化不属于 VCL 的类。

TComponent 的构造函数声明如下:

constructor Create(AOwner: TComponent); virtual;

要使组件参与此机制,它必须使用 override 指令声明其构造函数。

该过程的另一个关键是类引用。例如

type
TComponentClass = class of TComponent;

读取 .dfm 文件时创建组件的代码大致如下:

var
ComponentClass: TComponentClass;
Component, Owner: TComponent;
....
ComponentClass = FindComponentClass(ReadComponentClassName);
Component := ComponentClass.Create(Owner);

现在,如果该机制不使用虚拟构造函数,那么将调用的构造函数将为TComponent.Create。因此您的构造函数 TMyLabel.Create 永远不会被调用。

这就是为什么在从 TComponent 派生时必须在构造函数中包含 override 指令。

关于delphi - 重写和非重写构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9280546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com