如何检查后代 class 是否覆盖了所有虚拟方法?
How do I check that a descendent class overrides all virtual methods?
上下文
在 DelphiAST 中有一个基础 class: TmwSimplePasPar
解析 Delphi 代码。
此外还有一个 class: TPasSyntaxTreeBuilder
应该覆盖其基础 class 中的每个方法。
问题
有没有办法检查后代 class 是否覆盖了其基础 class 中的每个虚拟方法?
如果能加入断言就好了。
TPasSyntaxTreeBuilder.Create;
begin
Assert(Self.OverridenMethods.Count = (BaseClass.VirtualMethodCount - TObject.VirtualMethodCount));
....
请注意,我说的是所有虚拟方法,而不仅仅是抽象方法(不实现抽象方法会发出警告)。
查看 class 的 VMT 插槽并再次比较它们与基础 class 的 VMT 插槽。
在 Spring4D 中有这个函数(在 Spring.VirtualClass.pas
中):
function IsVirtualMethodOverride(baseClass, classType: TClass; method: Pointer): Boolean;
我不会在这里发布整个代码,因为它适用于一些内部 VMT 结构记录 - 请自行查看代码。
FWIW:我刚刚发现该例程中有一个小错误,我会尽快修复它。
上下文
在 DelphiAST 中有一个基础 class: TmwSimplePasPar
解析 Delphi 代码。
此外还有一个 class: TPasSyntaxTreeBuilder
应该覆盖其基础 class 中的每个方法。
问题
有没有办法检查后代 class 是否覆盖了其基础 class 中的每个虚拟方法?
如果能加入断言就好了。
TPasSyntaxTreeBuilder.Create;
begin
Assert(Self.OverridenMethods.Count = (BaseClass.VirtualMethodCount - TObject.VirtualMethodCount));
....
请注意,我说的是所有虚拟方法,而不仅仅是抽象方法(不实现抽象方法会发出警告)。
查看 class 的 VMT 插槽并再次比较它们与基础 class 的 VMT 插槽。
在 Spring4D 中有这个函数(在 Spring.VirtualClass.pas
中):
function IsVirtualMethodOverride(baseClass, classType: TClass; method: Pointer): Boolean;
我不会在这里发布整个代码,因为它适用于一些内部 VMT 结构记录 - 请自行查看代码。
FWIW:我刚刚发现该例程中有一个小错误,我会尽快修复它。