Saya telah membaca C ++ FAQ dan ingin tahu tentang friend
deklarasi tersebut. Saya pribadi belum pernah menggunakannya, namun saya tertarik menjelajahi bahasa.
Apa contoh yang baik untuk digunakan friend
?
Membaca FAQ sedikit lebih lama Saya suka gagasan tentang <<
>>
operator kelebihan dan menambahkan sebagai teman dari kelas-kelas itu. Namun saya tidak yakin bagaimana ini tidak merusak enkapsulasi. Kapan pengecualian ini bisa tetap dalam ketatnya yaitu OOP?
c++
oop
encapsulation
friend
Peter Mortensen
sumber
sumber
Jawaban:
Pertama (IMO) tidak mendengarkan orang yang mengatakan
friend
itu tidak berguna. Ini berguna. Dalam banyak situasi Anda akan memiliki objek dengan data atau fungsionalitas yang tidak dimaksudkan untuk tersedia untuk umum. Hal ini terutama berlaku untuk basis kode besar dengan banyak penulis yang mungkin hanya terbiasa dengan bidang yang berbeda.Ada ADALAH alternatif untuk teman penspesifikasi, tetapi sering kali tidak praktis (kelas beton tingkat cpp / typedef bertopeng) atau tidak mudah (komentar atau konvensi nama fungsi).
Ke jawabannya;
The
friend
specifier memungkinkan akses kelas yang ditunjuk untuk data atau fungsi lindung dalam kelas membuat pernyataan teman. Misalnya dalam kode di bawah ini siapa pun dapat meminta nama anak, tetapi hanya ibu dan anak yang dapat mengubah nama.Anda dapat mengambil contoh sederhana ini lebih jauh dengan mempertimbangkan kelas yang lebih kompleks seperti Window. Kemungkinan besar Window akan memiliki banyak elemen fungsi / data yang tidak boleh diakses publik, tetapi ADA dibutuhkan oleh kelas terkait seperti WindowManager.
sumber
friend
meningkatkan enkapsulasi.friend
memberikan akses selektif kepada anggota, sepertiprotected
halnya. Setiap kontrol yang lebih baik lebih baik daripada memberikan akses publik. Bahasa lain juga mendefinisikan mekanisme akses selektif, pertimbangkan C #internal
. Sebagian besar kritik negatif tentang penggunaanfriend
terkait dengan kopling ketat, yang umumnya dipandang sebagai hal yang buruk. Namun, dalam beberapa kasus, kopling ketat justru yang Anda inginkan danfriend
memberi Anda kekuatan itu.friend
yang bukan memberikan contoh yang memotivasi . Contoh Window / WindowManager lebih baik dari contoh yang ditunjukkan, tetapi terlalu kabur. Jawaban ini juga tidak membahas bagian enkapsulasi dari pertanyaan tersebut.Di tempat kerja kami menggunakan teman untuk menguji kode , secara ekstensif. Ini berarti kami dapat menyediakan enkapsulasi dan penyembunyian informasi yang tepat untuk kode aplikasi utama. Tetapi kita juga dapat memiliki kode tes terpisah yang menggunakan teman untuk memeriksa keadaan internal dan data untuk pengujian.
Cukuplah untuk mengatakan saya tidak akan menggunakan kata kunci teman sebagai komponen penting dari desain Anda.
sumber
Kata
friend
kunci memiliki sejumlah kegunaan yang baik. Berikut adalah dua kegunaan yang langsung terlihat oleh saya:Definisi Teman
Definisi teman memungkinkan untuk mendefinisikan suatu fungsi dalam lingkup kelas, tetapi fungsi tersebut tidak akan didefinisikan sebagai fungsi anggota, tetapi sebagai fungsi bebas dari namespace terlampir, dan tidak akan terlihat secara normal kecuali untuk pencarian bergantung argumen. Itu membuatnya sangat berguna untuk overloading operator:
Kelas Dasar CRTP Pribadi
Terkadang, Anda menemukan bahwa suatu kebijakan membutuhkan akses ke kelas turunan:
Anda akan menemukan contoh yang tidak dibuat-buat untuk itu dalam jawaban ini . Penggunaan kode lain dalam jawaban ini . Basis CRTP melemparkan pointer ini, untuk dapat mengakses bidang data dari kelas turunan menggunakan data-anggota-pointer.
sumber
P<C>
dalamtemplate<template<typename> class P> class C : P<C> {};
menyatakan "Penggunaan template kelas C membutuhkan argumen template". Apakah Anda memiliki masalah yang sama atau mungkin tahu solusinya?FlexibleClass
dalamFlexibleClass
harus secara implisit merujuk pada tipenya sendiri.@roo : Enkapsulasi tidak rusak di sini karena kelas itu sendiri menentukan siapa yang dapat mengakses anggota pribadinya. Enkapsulasi hanya akan rusak jika ini bisa disebabkan dari luar kelas, misalnya jika Anda
operator <<
akan menyatakan "Saya seorang teman kelasfoo
."friend
menggantikan penggunaanpublic
, bukan penggunaanprivate
!Sebenarnya, FAQ C ++ sudah menjawab ini .
sumber
friend
tidak terkecuali. Satu-satunya pengamatan nyata di sini adalah bahwa C ++ memastikan enkapsulasi hanya pada waktu kompilasi. Dan Anda tidak perlu kata-kata lagi untuk mengatakannya. Sisanya adalah bollocks. Jadi, secara ringkas: bagian FQA ini tidak layak disebut.Contoh kanonik adalah untuk membebani operator <<. Penggunaan umum lainnya adalah untuk memungkinkan akses kelas pembantu atau admin ke bagian internal Anda.
Berikut adalah beberapa panduan yang saya dengar tentang teman C ++. Yang terakhir sangat mengesankan.
sumber
friend
kurasa.Bagaimana cara memecahkan enkapsulasi?
Anda memecahkan enkapsulasi ketika Anda mengizinkan akses tidak terbatas ke anggota data. Pertimbangkan kelas-kelas berikut:
c1
adalah jelas tidak dikemas. Siapa pun dapat membaca dan memodifikasix
di dalamnya. Kami tidak memiliki cara untuk menegakkan segala jenis kontrol akses.c2
jelas dienkapsulasi. Tidak ada akses publik untukx
. Yang dapat Anda lakukan adalah memanggilfoo
fungsi, yang melakukan beberapa operasi yang berarti di kelas .c3
? Apakah itu kurang dienkapsulasi? Apakah ini memungkinkan akses tanpa batas kex
? Apakah ini memungkinkan akses fungsi yang tidak diketahui?Tidak. Ini memungkinkan tepat satu fungsi untuk mengakses anggota pribadi kelas. Sama seperti
c2
itu. Dan sama sepertic2
, satu fungsi yang memiliki akses bukan "beberapa fungsi acak, tidak dikenal", tetapi "fungsi yang tercantum dalam definisi kelas". Sama sepertic2
, kita dapat melihat, hanya dengan melihat definisi kelas, daftar lengkap siapa yang memiliki akses.Jadi bagaimana tepatnya ini kurang dienkapsulasi? Jumlah kode yang sama memiliki akses ke anggota pribadi kelas. Dan setiap orang yang memiliki akses tercantum dalam definisi kelas.
friend
tidak merusak enkapsulasi. Itu membuat beberapa programmer orang Jawa merasa tidak nyaman, karena ketika mereka mengatakan "OOP", mereka sebenarnya berarti "Java". Ketika mereka mengatakan "Enkapsulasi", mereka tidak berarti "anggota pribadi harus dilindungi dari akses sewenang-wenang", tetapi "kelas Java di mana satu-satunya fungsi yang dapat mengakses anggota pribadi, adalah anggota kelas", meskipun ini omong kosong untuk beberapa alasan .Pertama, seperti yang sudah ditunjukkan, itu terlalu membatasi. Tidak ada alasan mengapa metode teman tidak boleh diizinkan untuk melakukan hal yang sama.
Kedua, itu tidak cukup ketat . Pertimbangkan kelas keempat:
Ini, menurut mentalitas Jawa yang disebutkan di atas, dirangkum dengan sempurna. Namun, ini benar-benar memungkinkan siapa saja untuk membaca dan memodifikasi x . Bagaimana itu masuk akal? (petunjuk: Tidak)
Intinya: Enkapsulasi adalah tentang dapat mengontrol fungsi mana yang dapat mengakses anggota pribadi. Ini bukan tentang di mana definisi fungsi-fungsi ini berada.
sumber
Versi umum lain dari contoh Andrew, kode-kopling yang ditakuti
Alih-alih khawatir jika kedua baris selalu dilakukan bersama dan dalam urutan yang konsisten, Anda bisa menjadikan metode pribadi dan memiliki fungsi teman untuk menegakkan konsistensi:
Dengan kata lain Anda dapat menjaga antarmuka publik lebih kecil dan memberlakukan invarian yang melintasi kelas dan objek dalam fungsi teman.
sumber
addChild
fungsi anggota juga mengatur induknya?setParent
adalah berteman, karena Anda tidak ingin mengizinkan klien untuk mengubah orang tua karena Anda akan mengelolanya diaddChild
/removeChild
kategori fungsi.Anda mengontrol hak akses untuk anggota dan fungsi menggunakan hak Pribadi / Dilindungi / Publik? jadi dengan asumsi ide masing-masing dan masing-masing dari 3 level itu jelas, maka harus jelas bahwa kita kehilangan sesuatu ...
Deklarasi anggota / fungsi sebagai dilindungi misalnya cukup umum. Anda mengatakan bahwa fungsi ini di luar jangkauan untuk semua orang (kecuali untuk anak yang diwarisi tentu saja). Tapi bagaimana dengan pengecualian? setiap sistem keamanan memungkinkan Anda memiliki semacam 'daftar putih' bukan?
Jadi teman memungkinkan Anda memiliki fleksibilitas memiliki isolasi benda padat batu, tetapi memungkinkan "celah" untuk dibuat untuk hal-hal yang Anda rasa dibenarkan.
Saya kira orang mengatakan itu tidak diperlukan karena selalu ada desain yang akan dilakukan tanpa itu. Saya pikir itu mirip dengan diskusi variabel global: Anda tidak boleh menggunakannya, Selalu ada cara untuk melakukannya tanpa mereka ... tetapi dalam kenyataannya, Anda melihat kasus-kasus di mana yang akhirnya menjadi (hampir) cara yang paling elegan. .. Saya pikir ini adalah kasus yang sama dengan teman-teman.
baik itu bukan cara untuk melihatnya. Idenya adalah untuk mengontrol siapa yang dapat mengakses apa, memiliki atau tidak fungsi pengaturan tidak ada hubungannya dengan itu.
sumber
friend
celahnya? Ini memungkinkan metode yang tercantum dalam kelas mengakses anggota pribadinya. Masih tidak membiarkan kode arbitrer mengaksesnya. Karena itu tidak berbeda dengan fungsi anggota publik.Saya menemukan tempat praktis untuk menggunakan akses teman: Fungsi pribadi yang paling sedikit.
sumber
Teman menjadi berguna ketika Anda sedang membangun sebuah wadah dan Anda ingin menerapkan iterator untuk kelas itu.
sumber
Kami memiliki masalah menarik yang muncul di perusahaan tempat saya bekerja sebelumnya di mana kami menggunakan teman untuk pengaruh yang layak. Saya bekerja di departemen kerangka kerja kami, kami menciptakan sistem tingkat engine dasar di atas OS kustom kami. Secara internal kami memiliki struktur kelas:
Semua kelas ini adalah bagian dari kerangka kerja dan dikelola oleh tim kami. Game yang diproduksi oleh perusahaan dibangun di atas kerangka kerja ini yang berasal dari salah satu anak Game. Masalahnya adalah bahwa Game memiliki antarmuka untuk berbagai hal yang memerlukan akses SinglePlayer dan TwoPlayer tetapi kami tidak ingin mengekspos di luar kelas kerangka kerja. Solusinya adalah menjadikan antarmuka itu pribadi dan memungkinkan TwoPlayer dan SinglePlayer mengaksesnya melalui pertemanan.
Sejujurnya seluruh masalah ini bisa diselesaikan dengan implementasi yang lebih baik dari sistem kami tetapi kami terkunci ke dalam apa yang kami miliki.
sumber
Jawaban singkatnya adalah: gunakan teman saat itu benar-benar meningkatkan enkapsulasi. Meningkatkan keterbacaan dan kegunaan (operator << dan >> adalah contoh kanonik) juga merupakan alasan yang bagus.
Adapun contoh-contoh meningkatkan enkapsulasi, kelas-kelas yang dirancang khusus untuk bekerja dengan internal kelas-kelas lain (kelas-kelas tes muncul di benak) adalah kandidat yang baik.
sumber
<<
dan>>
biasanya berteman, bukan anggota, karena menjadikan mereka anggota akan membuat mereka canggung untuk digunakan. Tentu saja, saya berbicara tentang kasus ketika operator tersebut perlu mengakses data pribadi; jika tidak, persahabatan tidak berguna.operator<<
danoperator>>
anggota kelas nilai bukannya bukan anggota, atau anggotai|ostream
, tidak akan memberikan sintaks yang diinginkan, dan saya tidak menyarankan itu. " Saya berbicara tentang kasus ketika para operator perlu mengakses data pribadi " Saya tidak begitu mengerti mengapa operator input / output perlu mengakses anggota pribadi.Pencipta C ++ mengatakan itu tidak mempermasalahkan prinsip enkapsulasi apa pun, dan saya akan mengutipnya:
Lebih dari jelas ...
sumber
Kegunaan lain: teman (+ virtual inheritance) dapat digunakan untuk menghindari diturunkan dari suatu kelas (alias: "buat kelas kurang dapat ditelusuri") => 1 , 2
Dari 2 :
sumber
Untuk melakukan TDD berkali-kali saya menggunakan kata kunci 'teman' di C ++.
Bisakah seorang teman mengetahui segalanya tentang saya?
Diperbarui: Saya menemukan jawaban yang berharga ini tentang kata kunci "teman" dari situs Bjarne Stroustrup .
sumber
Anda harus sangat berhati-hati tentang kapan / di mana Anda menggunakan
friend
kata kunci, dan, seperti Anda, saya jarang menggunakannya. Di bawah ini adalah beberapa catatan tentang penggunaanfriend
dan alternatifnya.Katakanlah Anda ingin membandingkan dua objek untuk melihat apakah keduanya sama. Anda dapat:
Masalah dengan opsi pertama, adalah bahwa itu bisa menjadi BANYAK pengakses, yang (sedikit) lebih lambat dari akses variabel langsung, lebih sulit untuk dibaca, dan rumit. Masalah dengan pendekatan kedua adalah Anda benar-benar memecah enkapsulasi.
Apa yang akan menyenangkan, adalah jika kita dapat mendefinisikan fungsi eksternal yang masih bisa mendapatkan akses ke anggota pribadi kelas. Kita dapat melakukan ini dengan
friend
kata kunci:Metode ini
equal(Beer, Beer)
sekarang memiliki akses langsung kea
danb
's anggota pribadi (yang mungkinchar *brand
,float percentAlcohol
, dll Ini adalah contoh yang agak dibikin, Anda akan lebih cepat menerapkanfriend
sebuah kelebihan beban== operator
, tapi kami akan mendapatkan itu.Beberapa hal yang perlu diperhatikan:
friend
BUKAN fungsi anggota kelaspublic
!)Saya hanya benar-benar menggunakan
friends
ketika jauh lebih sulit untuk melakukannya dengan cara lain. Sebagai contoh lain, fungsi banyak matematika vektor sering dibuat sebagaifriends
akibat interoperabilitasMat2x2
,Mat3x3
,Mat4x4
,Vec2
,Vec3
,Vec4
, dll Dan itu hanya jauh lebih mudah untuk menjadi teman, daripada harus menggunakan accesor mana-mana. Seperti yang ditunjukkan,friend
seringkali berguna ketika diterapkan pada<<
(sangat berguna untuk debugging),>>
dan mungkin==
operator, tetapi juga dapat digunakan untuk hal seperti ini:Seperti yang saya katakan, saya tidak
friend
sering menggunakannya sama sekali, tetapi kadang-kadang hanya itu yang Anda butuhkan. Semoga ini membantu!sumber
Sehubungan dengan operator << dan operator >> tidak ada alasan yang baik untuk membuat teman-teman operator ini. Memang benar bahwa mereka tidak boleh menjadi fungsi anggota, tetapi mereka juga tidak perlu menjadi teman.
Hal terbaik untuk dilakukan adalah membuat fungsi cetak publik (ostream &) dan membaca (istream &). Kemudian, tulis operator << dan operator >> dalam hal fungsi-fungsi tersebut. Ini memberi manfaat tambahan dengan memungkinkan Anda membuat fungsi-fungsi itu virtual, yang menyediakan serialisasi virtual.
sumber
Saya hanya menggunakan kata kunci teman untuk melepaskan fungsi yang dilindungi. Beberapa orang akan mengatakan bahwa Anda tidak boleh menguji fungsionalitas yang dilindungi. Namun, saya menemukan alat ini sangat berguna ketika menambahkan fungsionalitas baru.
Namun, saya tidak menggunakan kata kunci secara langsung di deklarasi kelas, alih-alih saya menggunakan hack-template yang bagus untuk mencapai ini:
Ini memungkinkan saya untuk melakukan hal berikut:
Bekerja pada GCC dan MSVC minimal.
sumber
Dalam C ++ "teman" kata kunci berguna dalam Overloading dan Membuat Jembatan Operator.
Opsi Sekarang First tidak bagus karena jika kita perlu membebani lagi operator ini untuk beberapa kelas yang berbeda maka kita harus kembali melakukan perubahan di kelas "ostream".1.) Kata kunci teman dalam overloading operator:
Contoh untuk overloading operator adalah: Katakanlah kita memiliki kelas "Point" yang memiliki dua variabel float
"x" (untuk koordinat x) dan "y" (untuk koordinat y). Sekarang kita harus membebani
"<<"
(operator ekstraksi) sehingga jika kita memanggil"cout << pointobj"
maka akan mencetak koordinat x dan y (di mana pointobj adalah objek dari class Point). Untuk melakukan ini kami memiliki dua opsi:Itu sebabnya pilihan kedua adalah yang terbaik. Sekarang kompiler dapat memanggil
"operator <<()"
fungsi:Karena kami telah menerapkan overloading di kelas Point. Jadi untuk memanggil fungsi ini tanpa objek, kita harus menambahkan
"friend"
kata kunci karena kita dapat memanggil fungsi teman tanpa objek. Sekarang deklarasi fungsi akan Sebagai:"friend ostream &operator<<(ostream &cout, Point &pointobj);"
2.) Kata kunci teman dalam membuat jembatan:
Misalkan kita harus membuat fungsi di mana kita harus mengakses anggota pribadi dari dua kelas atau lebih (umumnya disebut sebagai "jembatan"). Cara melakukan ini:
Untuk mengakses anggota pribadi dari suatu kelas, ia haruslah anggota dari kelas itu. Sekarang untuk mengakses anggota pribadi dari kelas lain, setiap kelas harus mendeklarasikan fungsi itu sebagai fungsi teman. Sebagai contoh: Misalkan ada dua kelas A dan B. Suatu fungsi
"funcBridge()"
ingin mengakses anggota pribadi dari kedua kelas. Maka kedua kelas harus menyatakan"funcBridge()"
sebagai:friend return_type funcBridge(A &a_obj, B & b_obj);
Saya pikir ini akan membantu untuk memahami kata kunci teman.
sumber
Seperti referensi untuk pernyataan teman mengatakan:
Jadi hanya sebagai pengingat, ada kesalahan teknis dalam beberapa jawaban yang mengatakan bahwa
friend
hanya dapat mengunjungi anggota yang dilindungi .sumber
Contoh pohon adalah contoh yang cukup bagus: Memiliki objek diimplementasikan dalam beberapa kelas yang berbeda tanpa memiliki hubungan warisan.
Mungkin Anda juga bisa membutuhkannya agar konstruktor terlindungi dan memaksa orang untuk menggunakan pabrik "teman" Anda.
... Oke, terus terang Anda bisa hidup tanpanya.
sumber
Tidak, ini hanya persahabatan satu arah: `(
sumber
Satu contoh spesifik di mana saya gunakan
friend
adalah ketika membuat kelas Singleton . Katafriend
kunci memungkinkan saya membuat fungsi accessor, yang lebih ringkas daripada selalu memiliki metode "GetInstance ()" di kelas.sumber
friend
tidak tidak perlu "pembenaran" tertentu, saat menambahkan fungsi anggota tidak.Fungsi dan kelas Teman menyediakan akses langsung ke anggota kelas pribadi dan terlindungi untuk menghindari melanggar enkapsulasi dalam kasus umum. Sebagian besar penggunaan menggunakan ostream: kami ingin dapat mengetik:
Namun, ini mungkin memerlukan akses ke data pribadi Point, jadi kami mendefinisikan operator kelebihan beban
Namun, ada implikasi enkapsulasi yang jelas. Pertama, sekarang kelas atau fungsi teman memiliki akses penuh ke SEMUA anggota kelas, bahkan yang tidak berkaitan dengan kebutuhannya. Kedua, implementasi kelas dan teman sekarang terjerat ke titik di mana perubahan internal di kelas dapat menghancurkan teman.
Jika Anda melihat teman sebagai perpanjangan kelas, maka ini bukan masalah, secara logis. Tetapi, dalam hal itu, mengapa perlu untuk mempelopori teman sejak awal.
Untuk mencapai hal yang sama dengan tujuan 'teman' untuk dicapai, tetapi tanpa melanggar enkapsulasi, seseorang dapat melakukan ini:
Enkapsulasi tidak rusak, kelas B tidak memiliki akses ke implementasi internal di A, namun hasilnya sama seperti jika kami telah menyatakan B sebagai teman A. Kompiler akan mengoptimalkan panggilan fungsi secara otomatis, jadi ini akan menghasilkan sama instruksi sebagai akses langsung.
Saya pikir menggunakan 'teman' hanyalah jalan pintas dengan manfaat yang bisa diperdebatkan, tetapi biaya pasti.
sumber
Ini mungkin bukan situasi kasus penggunaan aktual tetapi dapat membantu menggambarkan penggunaan teman di antara kelas.
ClubHouse
Kelas Anggota
Fasilitas
Jika Anda melihat hubungan kelas-kelas ini di sini; ClubHouse memiliki beragam jenis keanggotaan dan akses keanggotaan. Semua Anggota berasal dari kelas super atau basis karena mereka semua berbagi ID dan tipe yang disebutkan yang umum dan kelas luar dapat mengakses ID dan Jenis mereka melalui fungsi akses yang ditemukan di kelas dasar.
Namun melalui hierarki Anggota dan kelas turunannya seperti ini dan hubungannya dengan kelas ClubHouse, satu-satunya kelas turunan yang memiliki "hak istimewa" adalah kelas VIPMember. Kelas dasar dan 2 kelas turunan lainnya tidak dapat mengakses metode ClubHouse joinVIPEvent (), namun kelas Anggota VIP memiliki hak istimewa itu seolah-olah memiliki akses penuh ke acara tersebut.
Jadi dengan VIPMember dan ClubHouse itu adalah jalan akses dua arah di mana Kelas Anggota lainnya terbatas.
sumber
Ketika mengimplementasikan algoritma pohon untuk kelas, kode kerangka kerja yang diberikan oleh prof kepada kami memiliki kelas pohon sebagai teman dari kelas simpul.
Itu tidak benar-benar ada gunanya, selain membiarkan Anda mengakses variabel anggota tanpa menggunakan fungsi pengaturan.
sumber
Anda dapat menggunakan pertemanan ketika kelas yang berbeda (tidak mewarisi satu dari yang lain) menggunakan anggota pribadi atau kelas yang dilindungi.
dari http://www.cplusplus.com/doc/tutorial/inheritance/ .
Anda dapat melihat contoh ini di mana metode non-anggota mengakses anggota pribadi kelas. Metode ini harus dinyatakan dalam kelas ini sebagai teman kelas.
sumber
Mungkin saya melewatkan sesuatu dari jawaban di atas tetapi konsep penting lainnya dalam enkapsulasi adalah menyembunyikan implementasi. Mengurangi akses ke anggota data pribadi (detail implementasi suatu kelas) memungkinkan modifikasi kode yang lebih mudah nanti. Jika seorang teman langsung mengakses data pribadi, setiap perubahan pada bidang data implementasi (data pribadi), pecahkan kode yang mengakses data itu. Menggunakan metode akses sebagian besar menghilangkan ini. Cukup penting menurut saya.
sumber
Anda dapat mematuhi prinsip-prinsip OOP yang paling ketat dan paling murni dan memastikan bahwa tidak ada anggota data untuk kelas apa pun yang memiliki pengakses sehingga semua objek harus menjadi satu-satunya yang dapat mengetahui tentang data mereka dengan satu-satunya cara untuk bertindak atas mereka adalah melalui pesan tidak langsung , yaitu, metode.
Tetapi bahkan C # memiliki kata kunci visibilitas internal dan Java memiliki aksesibilitas tingkat paket default untuk beberapa hal. C ++ benar-benar mendekati ideal OOP dengan meminimalkan kompromi visibilitas ke dalam kelas dengan menentukan dengan tepat kelas mana dan hanya kelas lain yang bisa melihatnya.
Saya tidak benar-benar menggunakan C ++ tetapi jika C # memiliki teman saya akan melakukan itu daripada pengubah internal perakitan-global , yang saya benar-benar menggunakan banyak. Itu tidak benar-benar memecahkan inkapsulasi, karena unit penyebaran di .NET adalah sebuah perakitan.
Tapi kemudian ada atribut InternalsVisibleTo (otherAssembly) yang bertindak seperti mekanisme teman lintas-perakitan . Microsoft menggunakan ini untuk rakitan desainer visual .
sumber
Teman juga berguna untuk panggilan balik. Anda bisa menerapkan panggilan balik sebagai metode statis
di mana
callback
panggilan secaralocalCallback
internal, danclientData
memiliki instance Anda di dalamnya. Menurutku,atau...
Apa yang memungkinkan adalah teman didefinisikan murni dalam cpp sebagai fungsi c-style, dan tidak mengacaukan kelas.
Demikian pula, pola yang sering saya lihat adalah menempatkan semua anggota kelas yang benar - benar pribadi ke dalam kelas lain, yang dideklarasikan di header, didefinisikan dalam cpp, dan berteman. Ini memungkinkan coder untuk menyembunyikan banyak kerumitan dan kerja internal kelas dari pengguna header.
Di tajuk:
Di cpp,
Menjadi lebih mudah untuk menyembunyikan hal-hal yang tidak perlu dilihat hilir dengan cara ini.
sumber