संपादित करें: थोड़ी देर के लिए फेक पढ़ना मुझे पसंद है << >> ऑपरेटर ओवरलोडिंग और उन वर्गों के एक दोस्त के रूप में जोड़ना, हालांकि मुझे यकीन नहीं है कि यह कैसे अंतराल को नहीं तोड़ता है
यह अतिक्रमण को कैसे तोड़ेगा?
जब आप किसी डेटा सदस्य को अप्रतिबंधित एक्सेस की अनुमति देते हैं तो आप एनकैप्सुलेशन तोड़ देते हैं । निम्नलिखित वर्गों पर विचार करें:
class c1 {
public:
int x;
};
class c2 {
public:
int foo();
private:
int x;
};
class c3 {
friend int foo();
private:
int x;
};
c1
है स्पष्ट रूप से समझाया नहीं। कोई भी इसे पढ़ और संशोधित कर सकता x
है। हमारे पास किसी भी प्रकार के अभिगम नियंत्रण को लागू करने का कोई तरीका नहीं है।
c2
स्पष्ट रूप से समझाया गया है। कोई सार्वजनिक पहुँच नहीं है x
। आप केवल इतना कर सकते हैं कि foo
फ़ंक्शन को कॉल किया जाए , जो कक्षा में कुछ सार्थक संचालन करता है ।
c3
? क्या यह कम है? क्या यह अप्रतिबंधित पहुँच की अनुमति देता है x
? क्या यह अज्ञात कार्यों को एक्सेस करने की अनुमति देता है?
नहीं, यह कक्षा के निजी सदस्यों तक पहुंचने के लिए सटीक रूप से एक फ़ंक्शन की अनुमति देता है । जैसा c2
किया वैसा ही किया। और ठीक उसी तरह c2
, जिस फ़ंक्शन का एक्सेस है, वह "कुछ यादृच्छिक, अज्ञात फ़ंक्शन" नहीं है, लेकिन "क्लास परिभाषा में सूचीबद्ध फ़ंक्शन" है। जैसे c2
, हम देख सकते हैं, सिर्फ कक्षा की परिभाषाओं को देखकर, जिनके पास पूरी सूची है।
तो यह वास्तव में कैसे कम है? समान मात्रा में कोड की कक्षा के निजी सदस्यों तक पहुंच होती है। और हर किसी को किसके पास पहुंच है वर्ग परिभाषा में सूचीबद्ध है।
friend
एनकैप्सुलेशन को नहीं तोड़ता है। यह कुछ जावा लोगों के प्रोग्रामर को असहज महसूस कराता है, क्योंकि जब वे "ओओपी" कहते हैं, तो उनका वास्तव में मतलब "जावा" होता है। जब वे "एनकैप्सुलेशन" कहते हैं, तो उनका मतलब यह नहीं है कि "निजी सदस्यों को मनमाने ढंग से पहुंच से संरक्षित किया जाना चाहिए", लेकिन "एक जावा वर्ग जहां केवल निजी सदस्यों तक पहुंचने में सक्षम हैं, वर्ग के सदस्य हैं", भले ही यह पूरी तरह से बकवास है कई कारण ।
सबसे पहले, जैसा कि पहले ही दिखाया गया है, यह बहुत सीमित है। ऐसा कोई कारण नहीं है कि मित्र विधियों को ऐसा करने की अनुमति न दी जाए।
दूसरा, यह पर्याप्त प्रतिबंधात्मक नहीं है । एक चौथे वर्ग पर विचार करें:
class c4 {
public:
int getx();
void setx(int x);
private:
int x;
};
यह, पूर्वोक्त जावा मानसिकता के अनुसार, पूरी तरह से समझाया गया है।
और फिर भी, यह बिल्कुल किसी को भी एक्स को पढ़ने और संशोधित करने की अनुमति देता है । यह भी कैसे समझ में आता है? (संकेत: यह नहीं है)
नीचे पंक्ति: इनकैप्सुलेशन नियंत्रण करने में सक्षम है जो निजी सदस्यों तक पहुंच सकता है। यह ठीक नहीं है जहां इन कार्यों की परिभाषाएं स्थित हैं।