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

在Delphi中重新引入函数

发布时间:2020-12-15 05:22:40 所属栏目:大数据 来源:网络整理
导读:在Delphi中使用reintroduce关键字的动机是什么? 如果你有一个子类包含一个与父类中的虚函数具有相同名称的函数,并且它没有使用覆盖修饰符声明,那么它是一个编译错误。在这种情况下添加重新插入修饰符修复了错误,但我从来没有理解编译错误的推理。 解决方
在Delphi中使用reintroduce关键字的动机是什么?

如果你有一个子类包含一个与父类中的虚函数具有相同名称的函数,并且它没有使用覆盖修饰符声明,那么它是一个编译错误。在这种情况下添加重新插入修饰符修复了错误,但我从来没有理解编译错误的推理。

解决方法

如果你在一个后代类中声明一个与祖先类中的方法同名的方法,那么你将隐藏该祖先方法 – 这意味着如果你有一个后代类的实例(被引用为该类),那么你将不能得到祖先的行为。当祖先的方法是virtual或dynamic时,编译器会给你一个警告。

现在你有两个选择之一抑制该警告消息:

>添加关键字reintroduce只是告诉编译器你知道你是隐藏该方法,它抑制了警告。你仍然可以在你的实现中使用继承的关键字来调用ancestor方法。
>如果祖先的方法是virtual或dynamic,那么你可以使用override。它具有附加的行为,如果这个后代对象通过祖先类型的表达式访问,那么对该方法的调用仍将是后代方法(然后可以可选地通过继承来调用祖先)。

因此,覆盖和重新引入之间的差异在于多态性。重新引入,如果你把后代对象转换为父类型,那么调用该方法将得到祖先方法,但如果你访问它的后代类型,那么你将得到后代的行为。有覆盖你总是得到的后裔。如果祖先方法既不是虚拟也不是动态的,则重新引入不适用,因为该行为是隐式的。 (实际上,你可以使用类辅助程序,但我们现在不会去那里。)

尽管Malach说,你仍然可以在重新引入的方法中调用inherited,即使父对象既不是虚拟也不是动态的。

基本上重新引入就像覆盖,但它适用于非动态和非虚拟方法,并且如果对象实例通过祖先类型的表达式访问,它不会替换行为。

进一步说明:

重新引入是一种向编译器传达意图,没有发生错误的方法。我们使用override关键字覆盖祖先中的方法,但是它要求ancestor方法是virtual或dynamic,并且当对象作为祖先类访问时,您希望行为更改。现在输入reintroduce。它让你告诉编译器,你没有不小心创建一个方法与虚拟或动态祖先方法相同的名称(如果编译器没有警告你会很烦人)。

(编辑:李大同)

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

    推荐文章
      热点阅读