Anggota pribadi hanya dapat diakses di dalam kelas yang mendefinisikan mereka.
Anggota yang dilindungi dapat diakses di kelas yang mendefinisikan mereka dan di kelas yang mewarisi dari kelas itu.
Sunting: Keduanya juga dapat diakses oleh teman-teman dari kelas mereka, dan dalam hal anggota yang dilindungi, oleh teman-teman dari kelas yang diturunkan.
Sunting 2: Gunakan apa pun yang masuk akal dalam konteks masalah Anda. Anda harus mencoba membuat anggota menjadi pribadi kapan saja Anda bisa untuk mengurangi kopling dan melindungi implementasi kelas dasar, tetapi jika itu tidak memungkinkan, gunakan anggota yang dilindungi. Periksa C ++ FAQ untuk pemahaman yang lebih baik tentang masalah ini. Pertanyaan tentang variabel yang dilindungi ini mungkin juga membantu.
Anggota publik dari kelas A dapat diakses oleh semua orang.
Anggota yang dilindungi dari kelas A tidak dapat diakses di luar kode A, tetapi dapat diakses dari kode kelas apa pun yang berasal dari A.
Anggota pribadi dari kelas A tidak dapat diakses di luar kode A, atau dari kode kelas apa pun yang berasal dari A.
Jadi, pada akhirnya, memilih antara dilindungi atau pribadi menjawab pertanyaan-pertanyaan berikut: Seberapa banyak kepercayaan yang Anda bersedia untuk dimasukkan ke dalam programmer dari kelas turunan?
Secara default , anggap kelas turunan tidak dapat dipercaya, dan jadikan anggota Anda pribadi . Jika Anda memiliki alasan yang sangat bagus untuk memberikan akses gratis internal kelas ibu ke kelas turunannya, maka Anda dapat membuatnya terlindungi.
sumber
the protected data of the base class is part of the data of the derived class.
Memang. Maka, bukankah lebih baik untuk memiliki penulis dari kelas turunan menyatakan bahwa data di kelas mereka, bukan milikku? ... :-) ...The writer of the derived class is expected to handle this data properly or it is a bug.
Dalam pola NVI, tujuannya adalah untuk menjadikan semuanya pribadi, termasuk metode, untuk membatasi kerusakan yang bisa dilakukan penulis kelas turunan ke hierarki. Metode yang dilindungi sudah merupakan masalah potensial. Saya tidak yakin memperparah ini dengan menggunakan negara yang dilindungi adalah pendekatan yang tepat.Anggota yang dilindungi dapat diakses dari kelas turunan. Pribadi tidak.
Dalam hal "praktik terbaik", itu tergantung. Jika ada kemungkinan samar bahwa seseorang mungkin ingin mendapatkan kelas baru dari kelas Anda yang sudah ada dan membutuhkan akses ke anggota internal, buat mereka Terlindungi, bukan Pribadi. Jika bersifat pribadi, kelas Anda mungkin menjadi sulit untuk diwariskan dengan mudah.
sumber
Alasan mengapa MFC mendukung dilindungi, adalah karena itu adalah kerangka kerja. Anda mungkin ingin mensubkelas kelas MFC dan dalam hal itu antarmuka yang terproteksi diperlukan untuk mengakses metode yang tidak terlihat oleh penggunaan umum kelas tersebut.
sumber
Itu semua tergantung pada apa yang ingin Anda lakukan, dan apa yang Anda inginkan agar kelas turunan dapat melihatnya.
sumber
Atribut dan metode yang ditandai sebagai
protected
- tidak seperti yang pribadi - masih terlihat di subclass.Kecuali jika Anda tidak ingin menggunakan atau memberikan kemungkinan untuk mengganti metode dalam subkelas yang mungkin, saya akan membuatnya
private
.sumber
Lihatlah pertanyaan Variabel Anggota yang Dilindungi . Disarankan untuk menggunakan private sebagai default (seperti C ++
class
ses do) untuk mengurangi coupling. Variabel anggota yang dilindungi adalah ide yang paling buruk, fungsi anggota yang dilindungi dapat digunakan untuk misalnya pola Metode Templat.sumber
Anggota yang dilindungi hanya dapat diakses oleh keturunan kelas, dan dengan kode di modul yang sama. Anggota pribadi hanya dapat diakses oleh kelas tempat mereka dideklarasikan, dan dengan kode dalam modul yang sama.
Tentu saja fungsi teman membuang ini ke luar jendela, tapi oh well.
sumber
anggota pribadi hanya dapat diakses dari dalam kelas, anggota yang dilindungi dapat diakses di kelas dan kelas turunan. Ini adalah fitur warisan dalam bahasa OO.
Anda dapat memiliki warisan pribadi, dilindungi, dan publik dalam C ++, yang akan menentukan kelas turunan apa yang dapat diakses dalam hierarki warisan. C # misalnya hanya memiliki warisan publik.
sumber
private = hanya dapat diakses oleh induk (kelas dasar) (yaitu hanya orang tua saya yang bisa masuk ke kamar orang tua saya)
terlindung = dapat diakses oleh induk (kelas dasar), dan anak perempuannya (yaitu hanya orang tua saya yang bisa masuk ke kamar orang tua saya, tetapi memberikan izin putra / putri untuk masuk ke kamar orang tua)
publik = dapat diakses oleh induk (kelas dasar), anak perempuan, dan semua orang lainnya (yaitu hanya orang tua saya yang bisa masuk ke kamar orang tua saya, tetapi ini pesta rumah - mi casa su casa)
sumber
Karena tidak ada fungsi anggota publik yang diperlukan untuk mengambil dan memperbarui anggota yang dilindungi di kelas turunan, ini meningkatkan efisiensi kode dan mengurangi jumlah kode yang perlu kita tulis. Namun, programmer dari kelas turunan seharusnya mengetahui apa yang dia lakukan.
sumber
private
lebih disukai untuk data anggota. Anggota dalam kelas C ++ secaraprivate
default.public
lebih disukai untuk fungsi anggota, meskipun itu masalah pendapat. Setidaknya beberapa metode harus dapat diakses.public
dapat diakses oleh semua. Ini adalah opsi yang paling fleksibel dan paling tidak aman. Siapa saja dapat menggunakannya, dan siapa pun dapat menyalahgunakannya.private
sama sekali tidak dapat diakses. Tidak ada yang bisa menggunakannya di luar kelas, dan tidak ada yang bisa menyalahgunakan mereka. Bahkan di kelas turunan.protected
adalah kompromi karena dapat digunakan dalam kelas turunan. Ketika Anda berasal dari kelas, Anda memiliki pemahaman yang baik tentang kelas dasar, dan Anda berhati-hati untuk tidak menyalahgunakan anggota ini.MFC adalah pembungkus C ++ untuk Windows API, ia lebih suka
public
danprotected
. Kelas yang dihasilkan oleh Visual Studio penyihir memiliki campuran jelekprotected
,public
danprivate
anggota. Tetapi ada beberapa logika untuk kelas MFC sendiri.Anggota seperti
SetWindowText
itupublic
karena Anda sering perlu mengakses anggota ini.Anggota seperti
OnLButtonDown
, menangani notifikasi yang diterima oleh jendela. Mereka tidak boleh diakses, oleh karena itu merekaprotected
. Anda masih dapat mengaksesnya di kelas turunan untuk mengabaikan fungsi-fungsi ini.Beberapa anggota harus melakukan utas dan loop pesan, mereka tidak boleh diakses atau diganti, sehingga mereka dinyatakan sebagai
private
Dalam struktur C ++, anggota secara
public
default. Struktur biasanya digunakan hanya untuk data, bukan metode, oleh karena itupublic
deklarasi dianggap aman.sumber
private
default di Visual Studio. Secaraprivate
default di gcc juga, tidak pernahpublic
secara default. Kecuali saya salah lagi. Saya tidak dapat menemukan standar yang Anda maksud.Anggota pribadi hanya dapat diakses di kelas yang sama di mana ia telah menyatakan di mana sebagai anggota yang dilindungi dapat diakses di kelas di mana ia dinyatakan bersama dengan kelas yang diwarisi olehnya.
sumber
Pribadi : Ini adalah penentu akses. Secara default, instance (anggota) variabel atau metode kelas di c ++ / java bersifat pribadi. Selama pewarisan, kode dan data selalu diwariskan tetapi tidak dapat diakses di luar kelas. Kami dapat mendeklarasikan anggota data kami sebagai pribadi sehingga tidak ada yang dapat membuat perubahan langsung ke variabel anggota kami dan kami dapat menyediakan getter dan setter publik untuk mengubah anggota pribadi kami. Dan konsep ini selalu diterapkan dalam aturan bisnis.
Dilindungi : Ini juga merupakan penentu akses. Dalam C ++, anggota yang dilindungi dapat diakses di dalam kelas dan ke kelas yang diwarisi tetapi tidak di luar kelas. Di Jawa, anggota yang dilindungi dapat diakses di dalam kelas, ke kelas yang diwariskan serta ke semua kelas dalam paket yang sama.
sumber
Anggota kelas dasar yang tidak statis yang dilindungi dapat diakses oleh anggota dan teman dari kelas apa pun yang berasal dari kelas dasar itu dengan menggunakan salah satu dari yang berikut:
sumber
Pribadi: Dapat diakses oleh fungsi anggota kelas & fungsi teman atau kelas teman. Untuk kelas C ++ ini adalah specifier akses default.
Dilindungi: Dapat diakses oleh fungsi anggota kelas, fungsi teman atau kelas teman & kelas turunan.
Lihat tautan ini untuk detail lebih lanjut.
sumber
pengubah akses pribadi dan terlindungi adalah satu dan sama saja dengan anggota kelas dasar yang dilindungi dapat diakses di luar ruang lingkup kelas dasar dalam kelas anak (turunan). Ini juga berlaku sama untuk warisan. Tetapi dengan pengubah pribadi anggota kelas dasar hanya dapat diakses dalam lingkup atau kode kelas dasar dan fungsi temannya hanya '' ''
sumber