sunting: Membaca faq sedikit lebih lama Saya menyukai gagasan tentang << >> operator overloading dan menambahkan sebagai teman dari kelas-kelas itu, namun saya tidak yakin bagaimana ini tidak merusak enkapsulasi
Bagaimana cara memecahkan enkapsulasi?
Anda memecahkan enkapsulasi ketika Anda mengizinkan akses tidak terbatas ke anggota data. Pertimbangkan kelas-kelas berikut:
class c1 {
public:
int x;
};
class c2 {
public:
int foo();
private:
int x;
};
class c3 {
friend int foo();
private:
int x;
};
c1
adalah jelas tidak dikemas. Siapa pun dapat membaca dan memodifikasi x
di dalamnya. Kami tidak memiliki cara untuk menegakkan segala jenis kontrol akses.
c2
jelas dienkapsulasi. Tidak ada akses publik untuk x
. Yang dapat Anda lakukan adalah memanggil foo
fungsi, yang melakukan beberapa operasi yang berarti di kelas .
c3
? Apakah itu kurang dienkapsulasi? Apakah ini memungkinkan akses tanpa batas ke x
? 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 seperti c2
, satu fungsi yang memiliki akses bukan "beberapa fungsi acak, tidak dikenal", tetapi "fungsi yang tercantum dalam definisi kelas". Sama seperti c2
, 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:
class c4 {
public:
int getx();
void setx(int x);
private:
int x;
};
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.