2012-09-10 51 views
8

我刚注意到一些我从未意识到的东西。事实证明,这个类是在C#中有效:可以从同一类别的其他实例访问私人成员

class Foo 
{ 
    private string contents; 

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

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

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

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

+0

事实证明,有人已经问过一个非常类似的问题:http://stackoverflow.com/questions/346127/access-private-member-variable-of-the-class-using-its-object-instance?rq= 1。尽管如此,该答案的答案并没有给出这种设计选择的授​​权理由。这是否仅仅因为以不同的方式进行效率低下/不可能? – Oliver

回答

8

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

在C++中,Java和C#访问控制是作为静态编译时功能实现的。这样它不会给任何运行时间开销。只能按照这种方式实施每班控制。

+1

这是为什么?编译器不能仅仅禁止在(隐式或显式)'this'引用以外的任何方法上调用私有方法?这意味着私人方法不能被称为'this'的其他变量,但我没有看到任何缺点。我认为japreiss的回答更准确。 – herman

11

你将如何为不通过公共方法公开其所有内部状态的类的拷贝构造函数?

考虑这样的事情:

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

Car的公共接口不公开其Engine,但你需要它来进行复印。

+0

是的;这个。没有其他体面的方法来制作复制/克隆方法。如果你担心它以某种方式被外部程序访问或者其他问题,你可以使它在内部得到保护。 – Nikki9696

+0

实现equals()也是必需的。 – herman

相关问题