19

我刚刚注意到一些我以前从未意识到的事情。事实证明,这个类在 C# 中是有效的:

class Foo
{
    private string contents;

    public Foo(string str) {
        contents = str;
    }

    public void set(Foo other)
    {
        contents = other.contents;
    }
}

因此同一类的不同实例可以访问彼此的私有成员。

到目前为止,我认为对象的私有成员只能由该对象访问,而不能由同一类的其他实例访问。发现这一点有点令人惊讶。

在所有常见的面向对象语言中都是这种情况吗?这对我来说并不直观。

4

3 回答 3

16

这与 C++ 和 Java 中的相同:访问控制基于每个类而不是基于每个对象。

在 C++ 中,Java 和 C# 访问控制被实现为静态的编译时特性。这样它就不会产生任何运行时开销。只有按类控制才能以这种方式实现。

于 2012-09-10T16:09:02.543 回答
14

您将如何为一个不通过公共方法公开其所有内部状态的类创建一个复制构造函数?

考虑这样的事情:

class Car
{
public:
    void accelerate(double desiredVelocity);
    double velocity() const;
private:
    Engine myEngine;
};

Car公共接口不公开它Engine,但你需要它来制作副本。

于 2012-09-10T17:10:10.340 回答
1

对于完全相同的场景,Scala 中存在“特定于对象的私有”与 Java 也不支持的“特定于类的私有”。

class Foo {

  private[this] def contents // [this] marks the property as private to the owner

  def doFoo(other: Foo) {
    if (other.contents) { // this line won't compile
      // ...
    }
  }

}

令人惊讶的是,其他现代语言private[this] 与 private不支持此类功能,我理解这可能不是安全风险,因为它仍然与 Class 相关联,您仍然可以访问所有私有变量反射任何一种方式例如反射是否打破了私有方法的想法,因为私有方法可以在类之外访问?.

如果从 Python 语言的角度来看,它们甚至没有 C# 那样广泛的范围特性,最终都是关于代码组织的,而从语言设计的角度来看,这是新手必须经历的学习曲线

于 2019-03-22T16:26:24.560 回答