2012-09-10 71 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

相關問題