从类助手访问私有字段

时间:2015-08-12 17:55:38

标签: delphi helper delphi-xe8

鉴于

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'。鉴于私人成员的可见性受限,这是我直觉所期望的。 如果我没有看到Marco Cantu的Delphi 2007 Handbook of a helper的p89 / 90上的例子,那么在宣布课程的单位之外 它访问“帮助”类的私有字段,也是一个明确的声明 在接受的答案的开头段落中

Can I call static private class method with class helper?

似乎支持它:“众所周知,帮助者确实破解了私人可见性。因此,私人成员可以从班级助手那里看到......”

那么,为什么我会收到E2003 Undeclared Identifier错误?在我的理解或代码中,我显然在某处遗漏了某些东西。我使用XE4和XE6,btw和XE4在我引用的SO答案之前得到了同样的错误,这是从去年开始的。

2 个答案:

答案 0 :(得分:6)

下面列出的解决方案适用于Delphi Seattle的版本。

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

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

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

在Delphi 10.1柏林及其他地方,不再可能在帮助者中访问helpee的strict privateprivate成员。

答案 1 :(得分:0)

对于使用Delphi 10.2 / 10.3的用户-我在这里找到了一篇文章: How to access a private field from a class helper in Delphi 10.1 Berlin?

其中指出使用with Self do可以让您从类帮助器访问私有变量!我有一些使用self.variable的帮助程序类,但给出了错误,提示我无法访问私有区域。

with Self do为我解决了这个问题! :)所以如果您遇到这些问题..请自己尝试..