“祖先列表”在类助手语法中的目的是什么?它在哪里有记录?是否有任何使用示例?

10

包括最新版本的所有文档都给出了以下类/记录辅助语法:

type
   identifierName = class|record helper [(ancestor list)] for TypeIdentifierName
     memberList
   end;

它只是解释了什么...

祖先列表是可选的。它只能为类助手指定。

...没有进一步详细说明。在文档主题的其余部分中,使用示例仅利用了ancestor list是可选的这一事实。我看过的所有EMBA代码以及第三方代码都没有使用这个ancestor list部分。

因此,我的问题概述如下:

  • ancestor list在类助手语法中的目的是什么?
  • 它在哪里有记录?
  • 是否有任何使用示例?
1个回答

12

它允许助手函数继承:

{$APPTYPE CONSOLE}

type
  TObjectHelper = class helper for TObject
    procedure Foo;
  end;

  TObjectHelperAgain = class helper(TObjectHelper) for TObject
    procedure Bar;
  end;

procedure TObjectHelper.Foo;
begin
  Writeln('Foo');
end;

procedure TObjectHelperAgain.Bar;
begin
  Writeln('Bar');
end;

begin
  with TObject.Create do
  begin
    Foo;
    Bar;
  end;
end.

这是绕过限制的一种方法,因为在任何特定代码位置只能有一个活动助手。

据我所知,祖先列表没有文档记录。


顺便提一下,派生对象助手也可以是派生类的助手。换句话说,这也可以工作(编译并产生预期结果):TObjectHelperAgain = class helper(TObjectHelper) for TList。我刚试过了。当然,我会把它称为 TListHelper - Rudy Velthuis
2
但是 TStreamHelper = class helper(TListHelper) for TStream 无法编译。因此,被帮助的类必须与原始类相同或派生自原始类,而 TStream 并不派生自 TList - Rudy Velthuis
好的,我在看到你的评论之前就写了上面的评论。<g> - Rudy Velthuis
2
谢谢!我接受你的答案作为解决方案,但是为了完整起见,你能否请添加一些关于“列表”事物的输入,它意味着多个标识符作为祖先。如果有的话。 - Free Consulting
2
是的,如果您尝试在列表中添加多个项目,则会出现 [dcc32错误]:E2029需要 ')' 但找到 ',' 的错误提示。 - David Heffernan
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接