この興味深いスレッドにはかなりの数の回答が既に追加されていますが、この振る舞いが現状のままである理由については、本当の理由はわかりませんでした。試してみましょう:
過去に戻って
80年代のSmalltalkと90年代半ばのJavaの間のどこかで、オブジェクト指向の概念が成熟しました。クラスのすべてのデータ(フィールド)はプライベートであり、すべてのメソッドはパブリックであるため、もともとOOだけが利用できる概念(1978年に最初に言及)とは考えられていなかった情報の非表示は、Smalltalkで導入されました。90年代のOOの多くの新しい開発の間に、ベルトランドマイヤーは、彼の画期的な本であるオブジェクト指向ソフトウェア構築(OOSC)でOOの概念の多くを形式化しようとしました。 。
プライベートビジビリティの場合
Meyer氏によると、定義されたクラスのセット(192〜193ページ)でメソッドを使用できるようにする必要があります。これにより、非常に詳細な情報の非表示が明らかになります。次の機能は、classAとclassBおよびそのすべての子孫で使用できます。
feature {classA, classB}
methodName
彼の場合private
、次のように述べています。型をそれ自体のクラスに可視であると明示的に宣言しないと、修飾された呼び出しでその機能(メソッド/フィールド)にアクセスできません。つまりx
、が変数の場合、x.doSomething()
許可されません。もちろん、クラス自体の内部で無資格のアクセスが許可されます。
つまり、同じクラスのインスタンスによるアクセスを許可するには、そのクラスによるメソッドアクセスを明示的に許可する必要があります。これは、instance-privateとclass-privateと呼ばれることもあります。
プログラミング言語でのインスタンスプライベート
クラスプライベートの情報非表示とは対照的に、インスタンスプライベートの情報非表示を使用する、現在使用中の少なくとも2つの言語を知っています。1つは、メイヤーが設計した言語であるエッフェルであり、OOを極限まで引き上げます。もう1つはRubyで、現在でははるかに一般的な言語です。Rubyでは、「このインスタンスにプライベート」をprivate
意味します。
言語設計の選択肢
instance-privateを許可することはコンパイラーにとって困難であることが示唆されています。メソッドへの修飾された呼び出しを許可または禁止することは比較的簡単なので、私はそうは思いません。プライベートメソッドdoSomething()
が許可されている場合と許可されてx.doSomething()
いない場合、言語デザイナーはプライベートメソッドとフィールドに対してインスタンスのみのアクセシビリティを効果的に定義しています。
技術的な観点からは、どちらかを選択する理由はありません(特に、Eiffel.NETがILでこれを行うことができると考えると、多重継承があっても、この機能を提供しない固有の理由はありません)。
もちろん、これは好みの問題であり、すでに述べたように、一部のメソッドは、プライベートメソッドとフィールドのクラスレベルの可視性の機能がないと作成が難しい場合があります。
C#がクラスのカプセル化のみを許可し、インスタンスのカプセル化を許可しない理由
インスタンスのカプセル化に関するインターネットスレッド(言語がクラスレベルではなく、インスタンスレベルでアクセス修飾子を定義することを指す用語として使用される場合があります)を見ると、この概念はよく見過ごされます。ただし、一部の最近の言語では、少なくともプライベートアクセス修飾子に対してインスタンスのカプセル化を使用していることを考えると、それは、現在のプログラミングの世界で可能であり、実用的であると考えるようになります。
ただし、C#はその言語設計についてC ++とJavaを最も厳しく見ていました。EiffelとModula-3も画像に含まれていますが、Eiffelの多くの機能がないこと(多重継承)を考慮すると、プライベートアクセス修飾子に関しては、JavaやC ++と同じルートを選択したと思います。
Eric Lippert、Krzysztof Cwalina、Anders Hejlsberg、またはC#の標準に取り組んでいる他の誰かを手に入れようとする理由を本当に知りたい場合は、残念ながら、注釈付きのC#プログラミング言語に明確な注釈はありませんでした。