这个问题可能有点令人困惑,最好通过一个例子来说明:
unit Test
interface
type
TestClass = class()
Splitter1: TcxSplitter;
procedure SomeMethod();
end;
implementation
uses
cxSplitter;
// Locally-declared child type
type
TcxSplitterAccess = class(TcxSplitter);
procedure TestClass.SomeMethod()
var
pos: integer;
begin
// Access to protected field FPositionBeforeClose by casting
pos := TcxSplitterAccess(Splitter1).FPositionBeforeClose;
end;
Run Code Online (Sandbox Code Playgroud)
请注意,在实现部分中,有一个类型TcxSplitterAccess被声明为TcxSplitter该类的子类。在该方法中SomeMethod(),属于类TestClass,一个TcxSplitter对象被强制转换为本地声明的TcxSplitterAccess类,然后受保护的字段是对象访问。
作为具有 Java、C++、C# 等语言背景的人,这让我感到惊讶。在这些语言中,只要您是从该对象的类型或继承类型。例如,类中的方法ClazzA可以访问其他ClazzA对象的私有字段,因为访问是在类型级别而不是实例级别强制执行的。用这些语言在本地声明一个类不会让包含类访问本地类的受保护数据(编辑:正如评论中指出的那样,至少对于 Java 来说实际上不是这样)。
但是,在此示例中,该类型通过首先转换为该类型TestClass来直接访问TcxSplitter对象上的受保护字段TcxSplitterAccess。我无法找到有关此“技巧”为何有效的文档。Delphi 处理访问级别是否与类 …