从 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 private
或 private
成员。
致使用 Delphi 10.2/10.3 的用户 - 我在这里找到了一篇文章:
它指出使用 with Self do
可以让您从 class 助手访问私有变量!我有一些使用 self.variable 的助手 classes,它们给出了一个错误,不允许我访问私有区域。
with Self do
帮我解决了这个问题! :) 因此,如果您 运行 遇到这些问题.. 自己尝试一下..
给定
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 private
或 private
成员。
致使用 Delphi 10.2/10.3 的用户 - 我在这里找到了一篇文章:
它指出使用 with Self do
可以让您从 class 助手访问私有变量!我有一些使用 self.variable 的助手 classes,它们给出了一个错误,不允许我访问私有区域。
with Self do
帮我解决了这个问题! :) 因此,如果您 运行 遇到这些问题.. 自己尝试一下..