类助手不会覆盖祖先的虚方法

问题描述 投票:3回答:1

我总是将类助手理解为扩展类或部分类。它们就像扩展原始基类的代码一样。如果我复制了代码的接口部分并将其添加到基类中并且也是为了实现,那么代码的运行方式与帮助程序完全相同。这让我总是理解帮助器中的多态性以及为什么它们不能覆盖基类中的方法等等。

但我发现这并不完全正确,因为如果是这样,那么为什么他们不允许覆盖基类的祖先 - 父级的方法呢?

这是我的意思的一个例子(我将只为没有实现代码的头文件的代码):

type
  TAncestor = class
  public 
    procedure Test; virtual;
  end;

  TBase = class(TAncestor)
  public 
  end;

那么为什么下一个代码不对:

THelper = class helper of TBase
public 
  procedure Test; override;
end;

我的错误是:

在基类中找不到方法'测试'!

delphi polymorphism delphi-xe3
1个回答
9
投票

类助手无法修改原始类布局。这就是他们无法添加字段的原因(当然,他们可以添加非虚拟的非动态方法)。额外的方法实际上不是帮助类的一部分,它们只是告诉编译器每次看到该方法时,它应该假装它是原始类的一部分

但是重写虚拟方法意味着修改帮助类的虚方法表,这也是不可能的。编译器当然可以创建一个新的VMT(一个指向代码的指针数组),其中包含覆盖,但是,因为类助手不修改“help”实例,所以它不能简单地替换实例中的VMT指针用新的。因此,不能使实例引用新的VMT。

只有一种方法可以覆盖虚拟方法:通过继承。

Documentation说:

辅助类型可能不会声明实例数据,但允许使用类字段。

© www.soinside.com 2019 - 2024. All rights reserved.