delphi - 如何检查后代类是否覆盖所有虚拟方法?

标签 delphi inheritance rtti virtual-functions

上下文

在 DelphiAST 中,有一个基类:TmwSimplePasPar,用于解析 Delphi 代码。
此外,还有一个类:TPasSyntaxTreeBuilder,它应该重写其基类中的每个方法。

问题

有没有办法检查后代类是否覆盖了其基类中的每个虚拟方法?
能够放入断言就好了。

TPasSyntaxTreeBuilder.Create;
begin
  Assert(Self.OverridenMethods.Count = (BaseClass.VirtualMethodCount - TObject.VirtualMethodCount)); 
  ....

请注意,我谈论的是所有虚拟方法,而不仅仅是抽象方法(不实现抽象方法会发出警告)。

最佳答案

查看该类的 VMT 插槽,并再次将它们与基类的 VMT 插槽进行比较。

在Spring4D中有这个函数(在Spring.VirtualClass.pas中):

function IsVirtualMethodOverride(baseClass, classType: TClass; method: Pointer): Boolean;

我不会在这里发布完整的代码,因为它适用于一些内部 VMT 结构记录 - 请自行查看代码。

FWIW:我刚刚发现该例程中有一个小错误,我会尽快修复。

关于delphi - 如何检查后代类是否覆盖所有虚拟方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46404495/

相关文章:

delphi - Exit(1) 或 Result := 1; Exit in Delphi? 之间有什么区别

objective-c - 继承在模拟器上工作,但在 Iphone 上不行!

c# - 如何在不使用 RTTI 的情况下(优雅地)实现这一点?

delphi - 如何在面板中显示 Delphi 窗体?

Delphi 叠瓦式回调函数

Objective-C:如何声明一个对子类可见的静态成员?

delphi - 通过新 RTTI 处理索引属性时遇到问题 [D2010]

delphi - 如何重写调用以在 TEdit 中显示 CapsLock 提示窗口?

javascript - AngularJS : watch array property