鉴于
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答案之前得到了同样的错误,这是从去年开始的。
答案 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 private
或private
成员。
答案 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
为我解决了这个问题! :)所以如果您遇到这些问题..请自己尝试..