我一直将类助手理解为扩展类或部分类。它们的作用就像原始基类代码的扩展。如果我复制代码的接口部分并将其添加到基类中,并在实现中也这样做,那么代码的运行方式将与助手的运行方式完全相同。这让我始终了解助手中的多态性以及为什么它们不能重写基类中的方法等。
但我发现这并不完全正确,因为如果是这样那么为什么他们不允许重写祖先(基类的父级)的方法?
这是我的意思的一个例子(我只会放置标题代码,而不放置实现代码):
type
TAncestor = class
public
procedure Test; virtual;
end;
TBase = class(TAncestor)
public
end;
那么为什么下一个代码不正确:
THelper = class helper of TBase
public
procedure Test; override;
end;
我的错误是:
在基类中找不到方法“测试”!
类助手不能修改原始类布局。这就是为什么他们不能添加字段(但当然他们可以添加非虚拟非动态方法)。额外的方法并不是帮助类的真正一部分,它们只是告诉编译器每次看到该方法时,它应该pretend它是原来班级的一部分
但是重写虚拟方法意味着修改受帮助类的虚拟方法表,而这也是不可能的。编译器当然可以创建一个新的 VMT(指向代码的指针数组)并在其中进行覆盖,但是,因为类帮助器不会修改“帮助”实例,所以它不能简单地替换实例中的 VMT 指针与新的。因此无法使实例引用新的 VMT。
只有一种方法可以重写虚拟方法:通过继承。
文档 says:
辅助类型不能声明实例数据,但允许类字段。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)