gpt4 book ai didi

德尔福/帕斯卡 : overloading a constructor with a different prototype

转载 作者:行者123 更新时间:2023-12-03 14:34:32 26 4
gpt4 key购买 nike

我正在尝试使用

创建 TForm 的子类
  1. 针对某些情况的特殊构造函数,以及
  2. 将保持与当前代码的兼容性的默认构造函数。

这是我现在的代码:

interface
TfrmEndoscopistSearch = class(TForm)
public
/// original constructor kept for compatibility
constructor Create(AOwner : TComponent); overload; override;
/// additional constructor allows for a caller-defined base data set
constructor Create(AOwner : TComponent; ADataSet : TDataSet; ACaption : string = ''); overload;
end;

它似乎有效,但我总是收到编译器警告:

[Warning] test.pas(44): Method 'Create' hides virtual method of base type 'TCustomForm'
  • 添加“过载;”第二个构造函数之后将无法编译。 “[错误] test.pas(44):‘Create’的声明与之前的声明不同”。
  • 使第二个构造函数成为类函数,编译时不会出现任何错误或警告,但在运行时会因访问冲突而终止(所有成员变量均为 nil)。

最佳答案

有一个非常简单的方法可以避免这种情况。 给你的新构造函数一个不同的名称。与其他一些流行语言不同,Delphi 命名了构造函数;您不必将它们称为“创建”。您可以调用新的 CreateWithDataset 并且完全不干扰虚拟 Create 构造函数。

TfrmEndoscopistSearch = class(TForm)
/// original constructor kept for compatibility
constructor Create(AOwner: TComponent); override;
/// additional constructor allows for a caller-defined base data set
constructor CreateWithDataset(AOwner: TComponent; ADataSet: TDataSet; ACaption: string = '');
end;

事实上,除非您以多态方式实例化此类,否则您甚至不需要原始构造函数。你可以这样声明你的新的:

TfrmEndoscopistSearch = class(TForm)
/// additional constructor allows for a caller-defined base data set
constructor Create(AOwner: TComponent; ADataSet: TDataSet; ACaption: string = ''); reintroduce;
end;

尝试直接在 TfrmEndoscopistSearch 上调用单参数构造函数会产生编译错误。

<小时/>

(以多态方式创建它通常涉及使用 Application.CreateForm:

Application.CreateForm(TfrmEndoscopistSearch, frmEndoscopistSearch);

它总是调用 TComponent 中引入的单参数虚拟构造函数。除非它是您的主要表单,否则您不需要这样做。我写过my feelings on Application.CreateForm之前。)

关于德尔福/帕斯卡 : overloading a constructor with a different prototype,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1758917/

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