今天最近在 Stackoverflow 上我了解到:
我一直在努力理解这一切,所以这是另一个非常具体的问题,支持我处理构造函数的主要问题。
更新:替换了整个问题:
TComputer = class(TObject)
public
constructor Create(Teapot: string='');
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer); overload; virtual;
constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
构造 TCellPhone 时,可以使用 3 个构造函数:
- 杯子:整数
- 杯子:整数;茶壶:串
- [茶壶:字符串='']
问:为什么constructor(Teapot: string='')
不被隐藏?
现在我添加了第三个后代:
TComputer = class(TObject)
public
constructor Create(Teapot: string='');
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer); overload; virtual;
constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); override;
end;
构造TiPhone
四个构造函数时可用:
- 杯子:整数
- 杯子:整数
- 杯子:整数;茶壶:串
- [茶壶:字符串='']
为什么有四个构造函数?我覆盖了现有的三个之一。编辑:这可能是代码洞察力中的一个错误,它向我展示了四个 - 但是当两个相同时我怎么可能调用。
再次使用原始代码:
TComputer = class(TObject)
public
constructor Create(Teapot: string='');
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer); overload; virtual;
constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
已知TCellPhone
有三个构造函数:
- 杯子:整数
- 杯子:整数;茶壶:串
- [茶壶:字符串='']
如何更改声明TCellPhone
以隐藏祖先构造函数?例如,这样:
TNokia = class(TCellPhone)
end;
将只有两个构造函数:
- 杯子:整数
- 杯子:整数;茶壶:串
现在用于reintroduce
隐藏非虚拟祖先的情况。在前一种情况下TiPhone
,有四个构造函数(理想情况下只有两个 - 以TComputer
某种方式隐藏其祖先)。但即使我无法修复TComputer
,我也可以TiPhone
改为只有一个:
TComputer = class(TObject)
public
constructor Create(Teapot: string='');
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer); overload; virtual;
constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); reintroduce;
end;
现在TiPhone
只有一个构造函数:
- 杯子:整数
Reintroduce 通常只用于抑制隐藏虚拟祖先的警告。在这种情况下:
Create(Teapot: string = '')
不是虚拟的——但我仍然可以使用 reintroduce 来隐藏它。
但是现在,如果我添加另一个重载到TiPhone
:
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); reintroduce; overload;
constructor Create(Handle: String); overload;
end;
然后突然(以前隐藏的)祖先回来了:
- TiPhone.创建(7);
- TiPhone.Create('粉红色');
- TiPhone.Create(7, '粉红色');
- TiPhone.Create();
如您所见,我正在努力理解
- 当某事被隐藏时
- 如何隐藏某事
- 当显示某些东西时
- 如何显示某事