今天 最近在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时,有三种构造函数可用:
- Cup: Integer
- Cup: Integer; Teapot: string
- [Teapot: String = '']
问题:为什么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
时,有四个构造函数可用:
- Cup: Integer
- Cup: Integer
- Cup: Integer; Teapot: string
- [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;
众所周知,TCellPhone
已经有了三个构造函数:
- Cup: Integer
- Cup: Integer; Teapot: string
- [Teapot: String = '']
我该如何修改 TCellPhone
的声明以隐藏其祖先构造函数?例如:
TNokia = class(TCellPhone)
end;
只有两个构造函数:
- Cup: Integer
- Cup: Integer; Teapot: string
现在考虑当使用 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
只有一个构造函数:
- Cup: 整数
重新引入通常只用于抑制隐藏 虚拟 祖先的警告。在这种情况下:
Create(Teapot: string = '')
这个变量尚未被声明为虚拟的,但我仍然可以使用“reintroduce”关键字来隐藏它。
但是,如果我给TiPhone
添加另一个重载方法:
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); reintroduce; overload;
constructor Create(Handle: String); overload;
end;
突然间,之前隐藏的祖先们回来了:
- TiPhone.Create(7);
- TiPhone.Create('pink');
- TiPhone.Create(7, 'pink');
- TiPhone.Create();
正如你所看到的,我很难理解以下逻辑:
- 何时将某些内容隐藏
- 如何隐藏某些内容
- 何时显示某些内容
- 如何显示某些内容
reintroduce
。 - Rob Kennedy