来自相同 Class 的其他实例的 Protected/Private 属性的可见性
Visibility of Protected/Private Properties from Other Instances of Same Class
继承和可见性的基本规则如下:
- 从 class 中访问私有成员是可以的。
- 从子class访问私有成员是不正确的。
- 从超级class访问私有成员是不正确的。
- 从 class 的实例访问受保护的成员是可以的。
- 从子实例class访问受保护的成员是可以的。
- 从 superclass 访问受保护的成员是不正确的。
不太明显的是从相同 class 的 另一个实例 访问这些属性的规则,尽管在 the documentation:
- 从同一 class 的另一个实例访问私有成员是可以的。
- 从同一 class 的另一个实例访问受保护的成员是可以的。
发生这种情况是因为该对象可以访问 class 规范。这似乎是由于语言中的一种怪癖实现,尽管我们可以依赖它。我很好奇的是继承链上下游其他对象实例的可见性规则。我期望的是:
- 从 class 的另一个实例访问私有成员是可以的。
- 从另一个子实例访问私有成员class 不正确。
- 从另一个 superclass 实例访问私有成员是不正确的。
- 从 class 的另一个实例访问受保护的成员是可以的。
- 从子class的另一个实例访问受保护的成员是可以的。
- 从另一个 superclass 实例访问受保护的成员是不正确的。
这样对吗?
是的,没错。
可见性规则仅基于 classes,实例没有影响。因此,如果 class 可以访问同一实例中的特定成员,它也可以访问该 class 的其他实例中的该成员。
这不是一个怪癖,而是一个深思熟虑的设计选择,类似于许多其他 OO 语言(例如,我认为规则在 C++ 中基本相同)。一旦您授予 class 方法允许了解该 class 或一些相关 class 的实现细节,它正在处理的实例是否就是它并不重要被调用或 class.
的其他实例
不完全是。没错,规则只是基于类,它是同一个实例还是另一个实例并不重要,这基本上是你的问题。
但是,您在 protected 方面大体上犯了一个错误。来自文档:
Members declared protected can be accessed only within the class itself and by inherited and parent classes
(已添加突出显示)
所以,下面的说法是错误的:
Accessing protected members from a superclass is not OK.
Accessing protected members from another instance of a superclass is not OK.
继承和可见性的基本规则如下:
- 从 class 中访问私有成员是可以的。
- 从子class访问私有成员是不正确的。
- 从超级class访问私有成员是不正确的。
- 从 class 的实例访问受保护的成员是可以的。
- 从子实例class访问受保护的成员是可以的。
- 从 superclass 访问受保护的成员是不正确的。
不太明显的是从相同 class 的 另一个实例 访问这些属性的规则,尽管在 the documentation:
- 从同一 class 的另一个实例访问私有成员是可以的。
- 从同一 class 的另一个实例访问受保护的成员是可以的。
发生这种情况是因为该对象可以访问 class 规范。这似乎是由于语言中的一种怪癖实现,尽管我们可以依赖它。我很好奇的是继承链上下游其他对象实例的可见性规则。我期望的是:
- 从 class 的另一个实例访问私有成员是可以的。
- 从另一个子实例访问私有成员class 不正确。
- 从另一个 superclass 实例访问私有成员是不正确的。
- 从 class 的另一个实例访问受保护的成员是可以的。
- 从子class的另一个实例访问受保护的成员是可以的。
- 从另一个 superclass 实例访问受保护的成员是不正确的。
这样对吗?
是的,没错。
可见性规则仅基于 classes,实例没有影响。因此,如果 class 可以访问同一实例中的特定成员,它也可以访问该 class 的其他实例中的该成员。
这不是一个怪癖,而是一个深思熟虑的设计选择,类似于许多其他 OO 语言(例如,我认为规则在 C++ 中基本相同)。一旦您授予 class 方法允许了解该 class 或一些相关 class 的实现细节,它正在处理的实例是否就是它并不重要被调用或 class.
的其他实例不完全是。没错,规则只是基于类,它是同一个实例还是另一个实例并不重要,这基本上是你的问题。
但是,您在 protected 方面大体上犯了一个错误。来自文档:
Members declared protected can be accessed only within the class itself and by inherited and parent classes
(已添加突出显示)
所以,下面的说法是错误的:
Accessing protected members from a superclass is not OK.
Accessing protected members from another instance of a superclass is not OK.