2009-08-31 65 views
17

针对What is your longest-held programming assumption that turned out to be incorrect?问题,错误的假设之一是:你能解释一下关于封装的东西吗?

私有成员变量是 私有的实例,而不是 类。

Link

我没听清楚他在说什么,任何人都可以解释一下什么是错/右关于用一个例子?

+0

这与封装有关吗? – p4bl0 2009-08-31 13:41:31

+6

私有可见性是如何在诸如Java,C++和C#语言中实现封装的。# – 2009-08-31 13:43:44

+1

@ p4bl0封装和变量作用域如何相关?相当根本。 – meagar 2010-10-07 16:38:39

回答

35
public class Example { 
    private int a; 

    public int getOtherA(Example other) { 
    return other.a; 
    } 
} 

像这样。正如你所看到的,私有不会保护实例成员不被另一个实例访问。

顺便说一句,只要你有点小心,这并不全是坏事。 如果private不像上面的例子那样工作,编写equals()和其他类似的方法会很麻烦。

+3

因此,私人成员对于该类是私有的,并且一个实例可以访问另一个实例的私有成员,对吗? – 2009-08-31 13:42:06

+0

是的,这是正确的。 – 2009-08-31 13:51:04

+0

好的,非常感谢! – 2009-08-31 13:53:00

2

示例代码(JAVA):

public class MutableInteger { 
    private int value; 

    // Lots of stuff goes here 

    public boolean equals(Object o) { 
     if(!(o instanceof MutableInteger)){ return false; } 
     MutableInteger other = (MutableInteger) o; 
     return this.value == other.value; // <------------ 
    } 
} 

如果假设“私有成员变量是私有的实例”是正确的,该标线会导致编译器错误,因为other.value领域是私人和部分与正在调用equals()方法的对象不同。

但由于在Java中(和有知名度的概念大多数其他语言)private能见度每级,访问现场被允许在MutableInteger的所有代码,不相关被用来调用它什么实例。

+2

“以及其他所有具有可见性概念的语言,我认为”在Ruby中,私有是每个对象。 – sepp2k 2009-08-31 13:49:58

+0

感谢您的信息,迈克尔。 – 2009-08-31 13:53:34

+0

在斯卡拉你可以添加上下文:private [this] – egaga 2010-10-07 02:48:54

3

这里是Michael Borgwardt's answer你当等效能够访问其他对象的私有字段:

public class MutableInteger { 
    private int value; 

    // Lots of stuff goes here 

    public boolean equals(Object o) { 
     if(!(o instanceof MutableInteger)){ return false; } 
     MutableInteger other = (MutableInteger) o; 
     return other.valueEquals(this.value); // <------------ 
    } 

    @Override // This method would probably also be declared in an interface 
    public boolean valueEquals(int oValue) { 
     return this.value == oValue; 
    } 
} 

如今这是熟悉的Ruby程序员,但我已经在Java中一直这样做一会儿。我不想依赖访问另一个对象的私有字段。请记住,另一个对象可能属于一个子类,它可以将值存储在不同的对象字段中,或存储在文件或数据库等中。

相关问题