德尔福:什么时候重新引入隐藏祖先,什么时候显示它们?

德尔福:什么时候重新引入隐藏祖先,什么时候显示它们?,第1张

概述今天最近在Stackoverflow上我了解到: > reintroduce is used to hide ancestor constructors > reintroduce is used to show ancestor constructors 我一直试图理解这一切,所以这是另一个非常具体的问题,supporting my main question dealing with cons 今天最近在Stackoverflow上我了解到:

> reintroduce is used to hide ancestor constructors
> reintroduce is used to show 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个构造函数:

>杯子:整数
>杯子:整数;茶壶:字符串
> [茶壶: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;TiPhone = class(TCellPhone)public   constructor Create(Cup: Integer); overrIDe;end;

在构建TiPhone时,可以使用四个构造函数:

>杯子:整数
>杯子:整数
>杯子:整数;茶壶:字符串
> [茶壶: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有三个构造函数:

>杯子:整数
>杯子:整数;茶壶:字符串
> [茶壶:String =”]

如何更改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);
> TiPhone.Create(‘pink’);
> TiPhone.Create(7,’pink’);
> TiPhone.Create();

正如你所看到的,我正在努力理解它的逻辑

>什么东西被隐藏了
>如何隐藏某些东西
>什么时候出现
>如何展示一些东西

解决方法 您不使用重新引入来隐藏祖先类的方法.您可以简单地通过声明一个与祖先类中的名称相同的方法来实现,而不会覆盖或重载它.当祖先类的方法(隐藏的方法)是虚拟的时,您使用重新引入来抑制Delphi引发的警告.

如果后代的方法覆盖了祖先的方法,那么它就不会隐藏.对祖先方法的调用将被路由到后代.

如果后代的方法重载了祖先,那么它也不会隐藏.两者都可以打电话.

总结

以上是内存溢出为你收集整理的德尔福:什么时候重新引入隐藏祖先,什么时候显示它们?全部内容,希望文章能够帮你解决德尔福:什么时候重新引入隐藏祖先,什么时候显示它们?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1279315.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存