2009-08-31 15 views
17

What is your longest-held programming assumption that turned out to be incorrect? सवाल है, गलत मान्यताओं में से एक के जवाब में था:क्या आप इस बात को encapsulation के बारे में समझा सकते हैं?

कि निजी सदस्य चर उदाहरण और नहीं वर्ग के लिए निजी थे।

(Link)

मैं पकड़ नहीं सकता है कि वह क्या बारे में बात कर रहा है, किसी को भी समझा सकता है गलत है क्या/सही है कि एक उदाहरण के साथ के बारे में?

+0

यह encapsulation से कैसे संबंधित है? – p4bl0

+6

निजी दृश्यता यह है कि जावा, सी ++ और सी # –

+1

@ p4bl0 जैसी भाषाओं में encapsulation कैसे लागू किया गया है encapsulation और variable scope संबंधित कैसे हैं? मूल रूप से सुंदर। – meagar

उत्तर

35
public class Example { 
    private int a; 

    public int getOtherA(Example other) { 
    return other.a; 
    } 
} 

इस तरह। जैसा कि आप निजी देख सकते हैं, उदाहरण के सदस्य को किसी अन्य उदाहरण से एक्सेस करने से नहीं बचाता है।

बीटीडब्लू, यह तब तक बुरा नहीं है जब तक आप थोड़ा सावधान रहें। यदि निजी उपरोक्त उदाहरण में काम नहीं करेगा, तो बराबर() और अन्य तरीकों को लिखना बोझिल होगा।

+3

ताकि निजी सदस्य कक्षा के लिए निजी हों, और एक उदाहरण किसी अन्य इंस्टेंस के निजी सदस्य तक पहुंच सकता है, सही? –

+0

हां यह सही है। –

+0

ठीक है, बहुत बहुत धन्यवाद! –

2

उदाहरण कोड (जावा):

public class MutableInteger { 
    private int value; 

    // Lots of stuff goes here 

    public boolean equals(Object o) { 
     if(!(o instanceof MutableInteger)){ return false; } 
     MutableInteger other = (MutableInteger) o; 
     return this.value == other.value; // <------------ 
    } 
} 

तो इस धारणा सही थे "निजी सदस्य चर उदाहरण के लिए निजी हैं", चिह्नित लाइन एक संकलक त्रुटि उत्पन्न होगी, क्योंकि other.value क्षेत्र निजी और हिस्सा है जिसकी equals() विधि कहा जा रहा है उससे भिन्न ऑब्जेक्ट का।

लेकिन चूंकि जावा (और सबसे अन्य भाषाओं है कि दृश्यता अवधारणा) में private दृश्यता प्रति वर्ग है, क्षेत्र के लिए उपयोग MutableInteger के सभी कोड, क्या उदाहरण यह आह्वान करने के लिए इस्तेमाल किया गया था के अप्रासंगिक करने के लिए अनुमति दी है।

+2

"और अन्य सभी भाषा जिनमें दृश्यता अवधारणा है, मुझे लगता है" रूबी निजी प्रति वस्तु है। – sepp2k

+0

जानकारी के लिए धन्यवाद, माइकल। –

+0

स्कैला में आप संदर्भ जोड़ सकते हैं: निजी [यह] – egaga

3

यहाँ जब आप कर रहे हैं के लिए Michael Borgwardt's answer के बराबर है नहीं अन्य वस्तु के निजी क्षेत्रों तक पहुँचने में सक्षम:

public class MutableInteger { 
    private int value; 

    // Lots of stuff goes here 

    public boolean equals(Object o) { 
     if(!(o instanceof MutableInteger)){ return false; } 
     MutableInteger other = (MutableInteger) o; 
     return other.valueEquals(this.value); // <------------ 
    } 

    @Override // This method would probably also be declared in an interface 
    public boolean valueEquals(int oValue) { 
     return this.value == oValue; 
    } 
} 

आजकल इस रूबी प्रोग्रामर के लिए परिचित है, लेकिन मैं के लिए जावा में यह कर दिया है कुछ समय। मैं किसी अन्य ऑब्जेक्ट के निजी फ़ील्ड तक पहुंच पर भरोसा नहीं करना पसंद करता हूं। याद रखें कि अन्य ऑब्जेक्ट उप-वर्ग से संबंधित हो सकता है, जो किसी भिन्न ऑब्जेक्ट फ़ील्ड में या फ़ाइल या डेटाबेस आदि में मान संग्रहीत कर सकता है।

संबंधित मुद्दे