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

Class helper doesn't override ancestor's virtual methods

我一直将 class 助手理解为扩展 classes,或部分 classes。它们就像对原始基础 class 的代码的扩展。如果我复制了代码的接口部分并将其添加到基础 class 中,并且在实现中也这样做,代码将 运行 与 helper 完全相同。这让我始终理解助手中的多态性以及为什么它们不能覆盖基础 class 等方法。

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

下面是我的意思的例子(我只会放headers的代码,没有实现代码):

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

  TBase = class(TAncestor)
  public 
  end;

所以下一个代码为什么不对:

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

我遇到的错误是:

Method 'Test' not found in base class!

Class 助手不能修改原来的 class 布局。这就是为什么他们不能添加字段(但他们当然可以添加非虚拟非动态方法)。额外的方法并不是真正的帮助 class 的一部分,它们只是告诉编译器每次看到该方法时,它应该 假装 它是原始 class

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

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

Documentation 说:

A helper type may not declare instance data, but class fields are allowed.

尝试"class interception" (ggl it)
类似这样的东西类似于 delphi

中的 c# "partial class"
type
  TPageControl = class(Vcl.ComCtrls.TPageControl)
....