从类助手访问私有字段

特定

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手册p89 / 90,它提供了一个访问“帮助”类的私有领域的类助手,并且在接受的答案的开头段落中提出了一个明确的陈述。

我可以用类助手调用静态私有类方法吗?

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

那么,为什么我会收到E2003 Undeclared Identifier错误? 在我的理解或代码中,我明显错过了某个地方。 我使用XE4和XE6得到了同样的错误,顺便说一下,XE4在我之前引用的SO答案前,这是从去年开始的。


下面概述的解决方案适用于德尔福西雅图的版本。

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

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

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

在Delphi 10.1及其以后的版本中,不再可能通过助手访问strict privateprivate成员的帮助。

链接地址: http://www.djcxy.com/p/91061.html

上一篇: Accessing private fields from a Class Helper

下一篇: datasnap REST server UTF8 output