19

今まで気づかなかったことに気づきました。このクラスはC#で有効であることがわかります。

class Foo
{
    private string contents;

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

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

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

これまで、オブジェクトのプライベートメンバーには、同じクラスの他のインスタンスからではなく、そのオブジェクトからのみアクセスできると思っていました。これを見つけるのは少し驚きです。

これは、すべての一般的なオブジェクト指向言語に当てはまりますか?それは私には直感的ではありません。

4

3 に答える 3

16

これは、C ++およびJavaの場合と同じです。アクセス制御は、オブジェクトごとではなく、クラスごとに機能します。

C ++では、JavaおよびC#アクセス制御は、静的なコンパイル時機能として実装されます。このようにして、実行時のオーバーヘッドは発生しません。クラスごとの制御のみをその方法で実装できます。

于 2012-09-10T16:09:02.543 に答える
14

パブリックメソッドを介してすべての内部状態を公開しないクラスのコピーコンストラクターをどのように作成しますか?

次のようなことを考えてみてください。

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

Carパブリックインターフェイスはそのを公開しませんEngineが、コピーを作成するために必要です。

于 2012-09-10T17:10:10.340 に答える
1

まったく同じシナリオでは、Scalaには「オブジェクト固有のプライベート」があり、Javaでもサポートされていない「クラス固有のプライベート」があります。

class Foo {

  private[this] def contents // [this] marks the property as private to the owner

  def doFoo(other: Foo) {
    if (other.contents) { // this line won't compile
      // ...
    }
  }

}

これは、そのような機能が他の現代言語でサポートされていないことに驚きました。private [this] vs private、これはまだクラスに関連付けられており、すべてのプライベート変数にアクセスできることを考えると、セキュリティリスクではない可能性があることを理解しています。たとえば、リフレクションは、プライベートメソッドがクラスの外部からアクセスできるため、プライベートメソッドの概念を壊しますか?

Python言語の観点から見ると、C#のように広い範囲の機能すらありません。最終的には、コードの編成がすべてであり、言語設計の観点からは、新参者が経験しなければならない学習曲線です。

于 2019-03-22T16:26:24.560 に答える