加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 10:12:14 所属栏目:大数据 来源:网络整理
导读:今天最近在Stackoverflow上我了解到: reintroduce is used to hide ancestor constructors reintroduce is used to show ancestor constructors 我一直试图理解这一切,所以这是另一个非常具体的问题,supporting my main question dealing with constructors
今天最近在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引发的警告.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读