从 Class 助手访问私有字段

Accessing private fields from a Class Helper

给定

type
  TMyClass = class
  private
    FPrivateInt : Integer;
  protected
    FProtectedInt : Integer;
  public
    FPublicInt : Integer;
  end;

一个单元和

type
  TMyHelper = class helper for TMyClass
    function Sum : Integer;
  end;
[...]
function TMyHelper.Sum: Integer;
begin
  Result := 0;
  Result := Result + FPublicInt;
  Result := Result + FProtectedInt;
  Result := Result + FPrivateInt;  // <- compiler error here
end;

在另一个方面,XE8 编译器报告错误“E2003 未声明的标识符 'FPrivateInt'”。考虑到私有成员的可见性受限,这是我直觉上的预期 在声明 class 的单元之外,如果我没有看到 Marco Cantu 的 Delphi 2007 年 class 助手手册 p89/90 上的示例 它访问 "helped" class 的私有字段,也是一个明确的声明 在这个 q

的已接受答案的开头段落中

Can I call static private class method with class helper?

似乎支持它:"As is widely known, helpers do crack private visibility. So, private members are visible from a class helper. ..."

那么,为什么我会收到 E2003 未声明的标识符错误?在我的理解或代码中,我显然在某处遗漏了一些东西。我在使用 XE4 和 XE6 时遇到了同样的错误,顺便说一句,XE4 早于我引用的 SO 答案,这是去年的。

下面概述的解决方案适用于 Delphi 西雅图之前的版本。

出于我不知道的原因,您需要使用 Self 限定私有实例成员。所以,这个编译:

function TMyHelper.Sum: Integer;
begin
  Result := 0;
  Result := Result + FPublicInt;
  Result := Result + FProtectedInt;
  Result := Result + Self.FPrivateInt;
end;

与评论中的建议相反,方法也是如此。您需要显式包含 Self. 才能调用 helpee 中的私有方法。

在 Delphi 10.1 Berlin 及更高版本中,不再可能访问助手中被助手的 strict privateprivate 成员。

致使用 Delphi 10.2/10.3 的用户 - 我在这里找到了一篇文章:

它指出使用 with Self do 可以让您从 class 助手访问私有变量!我有一些使用 self.variable 的助手 classes,它们给出了一个错误,不允许我访问私有区域。

with Self do 帮我解决了这个问题! :) 因此,如果您 运行 遇到这些问题.. 自己尝试一下..