私有成员可以从同一个类的其他实例访问

时间:2012-09-10 16:02:47

标签: oop

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

class Foo
{
    private string contents;

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

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

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

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

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

3 个答案:

答案 0 :(得分:13)

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

考虑这样的事情:

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

Car的公共界面不公开其Engine,但您需要它来制作副本。

答案 1 :(得分:11)

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

在C ++中,Java和C#访问控制是作为静态编译时功能实现的。这样它就不会给任何运行时间开销。只有每类控制才能实现。

答案 2 :(得分:0)

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

class Foo {

  private[this] def isFoo = true

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

}

了解到这一点后,令人惊讶的是,并非所有现代语言都private[this] vs private支持它,我了解他们有自己的原因,并且考虑到它仍然与Class联系在一起,因此可能不会带来安全风险并且您仍然可以使用任何一种方式通过反射访问所有私有变量,例如Does reflection breaks the idea of private methods, because private methods can be access outside of the class?

如果您从Python语言的角度来看,它们甚至没有C#那样广泛的作用域功能,最后它全都与代码组织有关,而从语言设计的角度来看,它是新来者必须学习的曲线通过