更新:用一个更简单的例子解决了这个问题,最初接受的答案没有回答
给定以下类及其祖先:
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 个可见的构造函数:
- 杯子:整数
- 杯子:整数;茶壶:串
- 茶壶:string = ''
我该怎么做才能TCellPhone
使祖先构造函数(Teapot: string = ''
)不可见,只留下声明的构造函数:
- 杯子:整数
- 杯子:整数;茶壶:串
注意:通常拥有后代构造函数的简单行为会隐藏祖先:
TCellPhone = class(TComputer) public constructor Create(Cup: Integer); virtual; end;
- 杯子:整数
如果您想同时保留祖先构造函数和后代,您可以将后代标记为
overload
:TCellPhone = class(TComputer) public constructor Create(Cup: Integer); overload; virtual; end;
- 杯子:整数
- 茶壶:string = ''
在这个问题的示例代码中,Delphi 弄错了我的overload
关键字:
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer); overload; virtual;
constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
认为:
- 我想用祖先重载我的构造函数,
- 当我真的想用兄弟姐妹重载它时
我如何隐藏祖先构造函数?
注意:使用当前定义的 Delphi 语言可能无法隐藏祖先的非虚拟构造函数。“不可能”是一个有效的答案。
尝试回答(失败)
我尝试reintroduce
用(回退到我随机添加关键字的模式直到它起作用)标记后代构造函数:
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer); reintroduce; overload; virtual;
constructor Create(Cup: Integer; Teapot: string); reintroduce; overload; virtual;
end;
但这不起作用,所有三个构造函数仍然可见。:(
原始问题
我有一个对象,该对象来自一个具有构造函数不想看到的类:
TEniac = class(TObject)
constructor Create(PowerCord: TPowerCord=nil); //calls inherited Create
TComputer = class(TEniac) ...
constructor Create(PowerCord: TPowerCord=nil); //calls inherited Create(nil)
TCellPhone = class(TComputer)
constructor Create(sim: TSimChip; UnlockCode: Integer); //calls inherited Create(nil)
TiPhone = class(TCellPhone)
constructor Create(sim: TSimChip); //calls inherited Create(sim, 0)
注意:这是一个假设的例子。与现实世界一样,在不破坏现有代码的情况下无法更改祖先对象。
现在,当有人使用时,TiPhone
我什至不希望他们能够从以下位置看到构造函数TEniac
:
iphone := TiPhone.Create(powerCord);
更糟糕的是:如果他们调用那个构造函数,他们完全想念我的构造函数,以及在这两者之间完成的所有事情。调用错误的构造函数很容易,它们都在 IDE 代码完成中可见,并将编译:
TiPhone.Create;
他们得到一个完全无效的对象。
我可以更改TCellPhone
为在这些构造函数中引发异常:
TCellPhone.Create(PowerCord: TPowercord)
begin
raise Exception.Create('Don''t use.');
end;
但是开发人员不会意识到他们调用了错误的构造函数,直到客户有一天发现错误并对我们处以数十亿美元的罚款。事实上,我试图找到我调用错误构造函数的所有地方 - 但我不知道如何让 Delphi 告诉我!