Hari ini saya perhatikan bahwa saya pada dasarnya tidak pernah menggunakan protected
metode dalam kode C ++, karena saya jarang merasa perlu memanggil metode non-publik dari orang tua. Saya menggunakan protected di Java dalam pola metode templat, tetapi karena Anda bisa mengganti metode pribadi dalam C ++, saya juga tidak perlu protected
melakukannya.
Jadi apa sajakah skenario dunia nyata di mana saya ingin menggunakan protected
metode dalam kode C ++?
(Perhatikan bahwa saya tidak terlalu menyukai warisan implementasi, yang mungkin menjelaskan banyak hal ...)
sumber
Salah satu contoh yang sering saya gunakan adalah bahwa di Kelas Dasar objek saya Hierarki saya akan memiliki Logger yang dilindungi. Semua kelas dasar saya akan membutuhkan akses ke Logger, tetapi tidak ada alasan untuk membuatnya dapat diakses publik.
Juga, jika Anda menggunakan pola Templat, dan Anda memiliki metode eksekusi sebelum atau sesudah pada kelas dasar, Anda mungkin ingin memanggil implementasi basis dari metode utama. Jika basis hanya pribadi (dan masih bisa ditimpa dalam C ++), Anda tidak akan dapat memanggil implementasi basis dari metode penimpaan.
sumber
Hanya sebuah contoh yang pernah saya gunakan di masa lalu. Metode yang dilindungi sangat bagus untuk menyediakan fungsi implementasi spesifik, sementara juga memungkinkan kelas dasar untuk melacak hal-hal dengan benar. Pertimbangkan kelas dasar yang menyediakan fungsi inisialisasi yang dapat ditimpa, tetapi juga harus memiliki status untuk menentukan apakah diinisialisasi:
Semua baik-baik saja di sini. Kecuali ketika kelas turunan tidak repot-repot memanggil
setInitialized()
fakta bahwa siapa pun dapat menyebutnya (kita bisa membuat ini terlindungi di sini, dan alasan lain untuk menggunakan metode yang dilindungi!). Saya lebih suka kelas yang menggunakan anggota yang dilindungi virtual:Di kelas baru kami, semua inisialisasi masih didelegasikan ke kelas turunan. Asalkan pengecualian telah dilempar, kami mempertahankan kontrak "kelas ini diinisialisasi" yang menurut metode kami akan terjadi.
sumber
Seperti banyak fitur lainnya,
protected
Anda dapat memecah enkapsulasi hingga beberapa perluasan. Melanggar konsep OO murni biasanya dilakukan karena beberapa alasaninline
),friend
memungkinkan Anda membatasi akses ke anggota kelas ke beberapa teman)dan
protected
hanya salah satu alat di dalam kotak itu. Anda dapat menggunakannya jika Anda ingin memberikan kelas turunan akses ke beberapa bagian kelas yang harus disembunyikan dari masyarakat umum.Satu kasus di mana saya telah menggunakannya adalah untuk membuat semua konstruktor dari suatu kelas
protected
, pada dasarnya membuat kelas itu abstrak (Anda tidak bisa instantiate kecuali sebagai sub-objek dari objek dari kelas turunan).sumber
Mungkin itu desain yang buruk, tetapi saya memilikinya untuk sesuatu seperti ini:
Kelas turunan, dalam
update()
, dapat memicu sinyal dengan memanggiltrigger_signal()
. Tetapi karena hanya itu yang harus mereka lakukan dengan sinyal, sinyal itu sendiri dibiarkan pribadi. Fungsi pemicu dibuat terlindungi karena hanya kelas turunan yang dapat memicunya, bukan apa-apa sama sekali.sumber
"Metode Publik": Kelas dapat melakukan ini. "Metode Terlindungi": Bagaimana kelas dapat melakukan ini. "Metode Pribadi": Bagaimana kelas dapat melakukan ini, tetapi "Saya paranoid dan tidak ingin ada yang tahu bagaimana saya melakukannya".
Jadi, juru masak baru (pengembang) tiba di restoran cepat saji Anda. Anda mengajarkannya, Anda menjual burguers (metode umum), cara menyiapkan burguers (metode yang dilindungi), tetapi simpan saus resep rahasia yang "sudah dipatenkan" untuk Anda sendiri.
sumber