在Delphi中重新引入函数

前端之家收集整理的这篇文章主要介绍了在Delphi中重新引入函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在Delphi中使用reintroduce关键字的动机是什么?

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

解决方法

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

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

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

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

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

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

进一步说明:

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

猜你在找的Delphi相关文章