2012-09-10 16 views
8

私はこれまでに気付かなかったことに気付きました。このクラスはC#で有効です。同じクラスの他のインスタンスからアクセスできるプライベートメンバー

したがって、同じクラスの異なるインスタンスが互いにプライベートメンバーにアクセスできるようになりました。

今のところ、オブジェクトのプライベートメンバーにはそのオブジェクトだけがアクセスでき、同じクラスの他のインスタンスではアクセスできないと考えました。これを見つけるのは少し驚くべきことです。

これはすべての共通オブジェクト指向言語のケースですか?私には直感的ではありません。

+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

関連する問題