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

时间:2019-03-13 14:25:23

标签: delphi polymorphism delphi-xe3

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

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

这是我的意思的一个示例(我只会放置标头的代码,而无需实现代码):

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

  TBase = class(TAncestor)
  public 
  end;

那么下一个代码为什么不正确:

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

我的错误是:

  

在基类中找不到方法'Test'!

2 个答案:

答案 0 :(得分:9)

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

但是覆盖虚拟方法将意味着修改帮助类的虚拟方法表,而且这也是不可能的。编译器当然可以创建一个新的带有覆盖的VMT(代码指针数组),但是,由于类助手没有修改“帮助”实例,因此它不能简单地替换实例中的VMT指针。与新的。因此无法使实例引用新的VMT。

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

Documentation说:

  

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

答案 1 :(得分:1)

尝试“类拦截”(ggl it)
类似于delphi中的c#“ partial class”

type
  TPageControl = class(Vcl.ComCtrls.TPageControl)
....