gpt4 book ai didi

delphi - 重新引入 Delphi 中的函数

转载 作者:行者123 更新时间:2023-12-03 14:33:00 24 4
gpt4 key购买 nike

在 Delphi 中使用 reintroduce 关键字的动机是什么?

如果您的子类包含与父类中的虚函数同名的函数,并且未使用 override 修饰符声明它,则会出现编译错误。在这种情况下添加重新引入修饰符可以修复错误,但我一直没有掌握编译错误的原因。

最佳答案

如果您在后代类中声明的方法与祖先类中的方法同名,那么您将隐藏该祖先方法 - 意味着如果您有该后代类的实例(即作为该类引用)那么你就不会得到祖先的行为。当祖先的方法是虚拟的或动态的时,编译器会给你一个警告。

现在您有两种选择之一来抑制该警告消息:

  1. 添加关键字reintroduce只是告诉编译器您知道您正在隐藏该方法,并且它会抑制警告。您仍然可以在该派生方法的实现中使用inherited关键字来调用祖先方法。
  2. 如果祖先的方法是虚拟动态,那么您可以使用覆盖。它具有附加的行为,如果通过祖先类型的表达式访问此后代对象,则对该方法的调用仍将是对后代方法(然后可以选择通过继承调用祖先) )。

所以overridereintroduce之间的区别在于多态性。使用reintroduce,如果将后代对象强制转换为父类型,然后调用该方法,您将获得祖先方法,但如果您访问后代类型,则将获得后代的行为。通过覆盖,你总是会得到后代。如果祖先方法既不是虚拟也不是动态,则reintroduce不适用,因为该行为是隐式的。 (实际上您可以使用类助手,但我们现在不会去那里。)

尽管 Malach 这么说,您仍然可以在重新引入的方法中调用继承,即使父级既不是虚拟也不是 <强>动态。

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

进一步说明:

重新引入是一种向编译器传达您没有犯错误的意图的方式。我们使用override关键字覆盖祖先中的方法,但它要求祖先方法是虚拟动态,并且您希望当对象作为祖先类被访问时要改变的行为。现在输入重新引入。它可以让您告诉编译器您没有意外创建与虚拟或动态祖先方法同名的方法(如果编译器没有警告您,这会很烦人)。

关于delphi - 重新引入 Delphi 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53806/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com