edit: SSS biraz daha uzun okuma << >> operatör aşırı yükleme ve bu sınıfların bir arkadaşı olarak ekleme fikrini seviyorum, ancak bu nasıl kapsülleme kırmaz emin değilim
Kapsüllemeyi nasıl kırabilir?
Bir veri üyesine sınırsız erişime izin verdiğinizde kapsüllemeyi kesersiniz . Aşağıdaki sınıfları düşünün:
class c1 {
public:
int x;
};
class c2 {
public:
int foo();
private:
int x;
};
class c3 {
friend int foo();
private:
int x;
};
c1
olduğu açıkça saklanmış. Herkes okuyabilir ve içinde değişiklik yapabilir x
. Herhangi bir erişim kontrolünü zorlamanın hiçbir yolu yoktur.
c2
açık bir şekilde kapsüllenmiştir. Herkese açık erişim yok x
. Yapabileceğiniz tek şey , sınıf üzerinde bazı anlamlı işlemlerfoo
gerçekleştiren işlevi çağırmaktır .
c3
? Bu daha az kapsüllenmiş mi? Sınırsız erişime izin veriyor x
mu? Bilinmeyen işlevlerin erişmesine izin veriyor mu?
Hayır. Bir özelliğin sınıfın özel üyelerine erişmesini . Tıpkı c2
yaptığı gibi . Ve tıpkı c2
erişimi olan bir işlev "bazı rastgele, bilinmeyen işlev" değil, "sınıf tanımında listelenen işlev" dir. Tıpkı c2
, sınıf tanımlarına bakarak, kimin erişime sahip olduğunun tam bir listesini görebiliriz.
Peki, bu tam olarak nasıl daha az kapsüllenir? Aynı miktarda kod, sınıfın özel üyelerine erişime sahiptir. Ve erişimi olan herkes sınıf tanımında listelenir.
friend
kapsüllemeyi bozmaz. Bazı Java insan programcılarını rahatsız ediyor, çünkü "OOP" derken aslında "Java" demek . "Kapsülleme" dedikleri zaman, "özel üyelerin keyfi erişimlere karşı korunması gerektiği" anlamına gelmez, bunun yerine "tam üyelere erişebilen tek işlevlerin sınıf üyeleri olduğu bir Java sınıfı" anlamına gelir . birkaç sebep .
İlk olarak, daha önce gösterildiği gibi, çok kısıtlayıcı. Arkadaş yöntemlerinin aynı şeyi yapmasına izin verilmemesi için hiçbir neden yoktur.
İkincisi, yeterince kısıtlayıcı değil . Dördüncü sınıfı düşünün:
class c4 {
public:
int getx();
void setx(int x);
private:
int x;
};
Bu, yukarıda bahsedilen Java zihniyetine göre, mükemmel bir şekilde kapsüllenmiştir.
Yine de, kesinlikle herkesin x'i okumasına ve değiştirmesine izin verir . Bu nasıl bir anlam ifade ediyor? (ipucu: Öyle değil)
Alt satır: Kapsülleme, hangi işlevlerin özel üyelere erişebileceğini denetleyebilmekle ilgilidir. Bu işlevlerin tanımlarının tam olarak nerede olduğu ile ilgili değildir .