德尔福:什么时候重新引入隐藏祖先,什么时候显示它们?
今天最近在Stackoverflow上我了解到:
> reintroduce is used to hide ancestor constructors 我一直试图理解这一切,所以这是另一个非常具体的问题,supporting my main question dealing with constructors. 更新:替换了整个问题: 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个构造函数: >杯子:整数 问题:为什么没有隐藏构造函数(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; 将只有两个构造函数: >杯子:整数 现在针对重新引入用于隐藏非虚拟祖先的情况.在之前的案例中,TiPhone有四个构造函数(理想情况下只有两个 – TC计算机以某种方式隐藏其祖先).但即使我无法修复TC计算机,我也可以将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只有一个构造函数: >杯子:整数 重新引入通常仅用于抑制隐藏虚拟祖先的警告.在这种情况下: Create(Teapot: string = '') 不是虚拟的 – 但我仍然可以使用重新引入来隐藏它. 但现在,如果我添加另一个重载到TiPhone: TiPhone = class(TCellPhone) public constructor Create(Cup: Integer); reintroduce; overload; constructor Create(Handle: String); overload; end; 然后突然(先前隐藏的)祖先回来了: > TiPhone.Create(7); 正如你所看到的,我正在努力理解它的逻辑 >什么东西被隐藏了 解决方法
您不使用重新引入来隐藏祖先类的方法.您可以简单地通过声明一个与祖先类中的名称相同的方法来实现,而不会覆盖或重载它.当祖先类的方法(隐藏的方法)是虚拟的时,您使用重新引入来抑制Delphi引发的警告.
如果后代的方法覆盖了祖先的方法,那么它就不会隐藏.对祖先方法的调用将被路由到后代. 如果后代的方法重载了祖先,那么它也不会隐藏.两者都可以打电话. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |