2009-08-31 64 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中一直這樣做一會兒。我不想依賴訪問另一個對象的私有字段。請記住,另一個對象可能屬於一個子類,它可以將值存儲在不同的對象字段中,或存儲在文件或數據庫等中。

相關問題