Cukup banyak jawaban telah ditambahkan ke utas yang menarik ini, namun, saya tidak cukup menemukan alasan sebenarnya mengapa perilaku ini seperti itu. Biarkan saya mencobanya:
Kembali pada hari-hari
Di suatu tempat antara Smalltalk di 80-an dan Jawa pada pertengahan 90-an konsep orientasi objek matang. Penyembunyian informasi, yang awalnya tidak dianggap sebagai konsep yang hanya tersedia untuk OO (disebutkan pertama kali pada tahun 1978), diperkenalkan di Smalltalk karena semua data (bidang) suatu kelas bersifat pribadi, semua metode bersifat publik. Selama banyak perkembangan baru OO di tahun 90-an, Bertrand Meyer mencoba memformalkan banyak konsep OO dalam bukunya landmark Object Oriented Software Construction (OOSC) yang sejak saat itu dianggap sebagai referensi (hampir) definitif pada konsep OO dan desain bahasa. .
Dalam kasus visibilitas pribadi
Menurut Meyer, suatu metode harus tersedia untuk kelas-kelas tertentu (halaman 192-193). Ini jelas memberikan granularitas yang sangat tinggi dari penyembunyian informasi, fitur berikut tersedia untuk classA dan classB dan semua turunannya:
feature {classA, classB}
methodName
Dalam kasus private
ia mengatakan yang berikut: tanpa secara eksplisit menyatakan tipe yang terlihat oleh kelasnya sendiri, Anda tidak dapat mengakses fitur (metode / bidang) dalam panggilan yang memenuhi syarat. Yaitu jika x
variabel, x.doSomething()
tidak diizinkan. Akses tanpa pengecualian diizinkan, tentu saja, di dalam kelas itu sendiri.
Dengan kata lain: untuk mengizinkan akses oleh instance dari kelas yang sama, Anda harus mengizinkan metode akses oleh kelas itu secara eksplisit. Ini kadang-kadang disebut instance-private versus class-private.
Instance-private dalam bahasa pemrograman
Saya tahu setidaknya ada dua bahasa yang saat ini digunakan yang menggunakan penyembunyian informasi instance-privat sebagai lawan penyembunyian informasi kelas-privat. Salah satunya adalah Eiffel, bahasa yang dirancang oleh Meyer, yang membawa OO ke titik ekstrem. Yang lainnya adalah Ruby, bahasa yang jauh lebih umum saat ini. Di Ruby, private
berarti: "pribadi ke instance ini" .
Pilihan untuk desain bahasa
Telah disarankan bahwa mengizinkan instance-private akan sulit untuk kompiler. Saya rasa tidak, karena relatif mudah untuk hanya mengizinkan atau melarang panggilan yang memenuhi syarat untuk metode. Jika untuk metode pribadi, doSomething()
diizinkan dan x.doSomething()
tidak, perancang bahasa telah secara efektif menentukan aksesibilitas hanya-instance untuk metode dan bidang pribadi.
Dari sudut pandang teknis, tidak ada alasan untuk memilih satu cara atau yang lain (terutama ketika mempertimbangkan bahwa Eiffel.NET dapat melakukan ini dengan IL, bahkan dengan banyak pewarisan, tidak ada alasan yang melekat untuk tidak menyediakan fitur ini).
Tentu saja, ini masalah selera dan seperti yang telah disebutkan sebelumnya, beberapa metode mungkin lebih sulit untuk ditulis tanpa fitur visibilitas tingkat kelas dari metode dan bidang pribadi.
Mengapa C # hanya memungkinkan enkapsulasi kelas dan bukan enkapsulasi instance
Jika Anda melihat utas internet pada enkapsulasi instan (istilah yang kadang-kadang digunakan untuk merujuk pada fakta bahwa suatu bahasa mendefinisikan pengubah akses pada tingkat instance, sebagai lawan dari level kelas), konsep ini sering disukai. Namun, mengingat bahwa beberapa bahasa modern menggunakan enkapsulasi instance, setidaknya untuk pengubah akses pribadi, membuat Anda berpikir itu bisa dan sedang digunakan di dunia pemrograman modern.
Namun, C # telah diakui tampak paling sulit di C ++ dan Java untuk desain bahasanya. Sementara Eiffel dan Modula-3 juga ada dalam gambar, mengingat banyak fitur Eiffel yang hilang (multiple inheritance) saya percaya mereka memilih rute yang sama seperti Java dan C ++ ketika datang ke pengubah akses pribadi.
Jika Anda benar-benar ingin tahu mengapa Anda harus mencoba menghubungi Eric Lippert, Krzysztof Cwalina, Anders Hejlsberg atau siapa pun yang bekerja pada standar C #. Sayangnya, saya tidak dapat menemukan catatan definitif dalam Bahasa Pemrograman C # yang beranotasi .