2009-05-11 11 views
13

कक्षा में कक्षा के लिए गेटर और सेटर मानते हैं कि हमारे पास गुण और गेटर/सेटर के साथ कक्षा इनर क्लास है। हमारे पास इनर क्लास युक्त कक्षा ओटर क्लास भी है।वर्ग सी #

उदा।

class InnerClass 
{ 
    private int m_a; 
    private int m_b; 

    public int M_A 
    { 
     get 
     { 
      return m_a; 
     } 
     set 
     { 
      m_a = value; 
     } 
    } 
} 

class OuterClass 
{ 
    private InnerClass innerClass 
} 

मैं बाहरी क्लास के आंतरिक क्लास सदस्य के लिए सही गेटर और सेटर कैसे कार्यान्वित करूं?

अग्रिम धन्यवाद!

+0

"सेट" होना चाहिए {m_a = value;} –

+0

आपको पता है कि आपको ठीक करने के लिए प्रतिनिधि मिल गया है;) – annakata

उत्तर

24

वाक्यविन्यास कोई अलग नहीं होगा। बस ...

public InnerClass InnerClass 
{ 
    get { return innerClass; } 
    set { innerClass = value; } 
} 

वैसे, आप .NET 3.5 में सी # का उपयोग कर रहे हैं, तो आप स्वत: संपत्ति पीढ़ी सुविधा अगर आपके पास एक सरल संपत्ति है कि बस पढ़ता है और एक समर्थन करने के लिए लिखता है उपयोग कर सकते हैं स्टोर (जैसा कि आप ऊपर है)। sytax एक अमूर्त संपत्ति के समान है:

public InnerClass InnerClass { get; set; } 

यह स्वचालित रूप से भंडारण के लिए एक निजी सदस्य उत्पन्न करता है, तो get में इसे से पढ़ता है और set में इसे करने के लिए लिखता है।

2
public InnerClass InnerClass 
    { 
     get 
     { 
      return innerClass; 
     } 
     set 
     { 
      innerClass = value; 
     } 
    } 
0

यह इस बात पर निर्भर करता है कि आंतरिक वर्ग को कैसे काम करना चाहिए। ..

public InnerClass InnerClass{ 
    get{ return innerClass; } 
    set{ innerClass.CopyFrom(value); /* Pseudo method call */ } 
} 

इसे इस तरह करने से, आप OuterClass के माध्यम से जब तक स्पष्ट उदाहरण जोड़ तोड़ से बाहर कोड को रोकने

+0

वास्तव में, क्योंकि आप गेटटर में उदाहरण वापस कर रहे हैं। ऐसा करने का एकमात्र असली तरीका (और यह दृष्टिकोण थोड़ा सुगंधित है ...) गेटटर में एक नया उदाहरण वापस करने के लिए एक ही CopyFrom विधि का उपयोग करना होगा। –

+0

मुझे लगता है कि आप गलत समझा। मुद्दा यह है कि आप उदाहरण को संशोधित कर सकते हैं, लेकिन आपको इसे OuterClass के उदाहरण के माध्यम से स्पष्ट रूप से करना है। उदाहरण OuterClass.InnerClass foo = new OuterClass.InnerClass(); foo.M_A = 1; outerInstance.InnerClass = foo; //outerInstance.InnerClass.M_A बराबर 1 foo.SomeProperty = 2; // outerInstance.InnerClass.M_A अभी भी 1 बाहरी इंस्टेंस के बराबर है।InnerClass = foo; //outerInstance.InnerClass.M_A बराबर 2 – James

0

आप हैं: बाहरी वर्ग के लिए "स्वयं" भीतरी वर्ग, जिस स्थिति में आवश्यकता हो सकती है आंतरिक वर्ग के सदस्यों को बिना किसी आंतरिक वर्ग के अपने आप का उपयोग करने का मतलब है, आप निम्न कोड का उपयोग कर सकते हैं। अगर आप this.innerClass का पर्दाफाश करना चाहते हैं, तो InnerClass के क्षेत्रों को बेनकाब करने के तरीके में कोई अंतर नहीं है। के रूप में

class InnerClass 
{ 
    public int a{ get; set; } 
    public int b{ get; set; } 
} 

class OuterClass 
{ 
    public InnerClass innerClass{ get; set; } 
} 

यह परोक्ष एक ही है:

class InnerClass 
{ 
    private int _a; 
    public int a 
    { 
     get 
     { 
      return _a; 
     } 
     set 
     { 
      _a = value; 
     } 
    } 

    private int _b; 
    public int b 
    { 
     get 
     { 
      return _b; 
     } 
     set 
     { 
      _b = value; 
     } 
    } 
} 

class OuterClass 
{ 
    private InnerClass _innerClass; 
    public InnerClass innerClass 
    { 
     get 
     { 
      return _innerClass; 
     } 
     set 
     { 
      _innerClass = value; 
     } 
    } 
} 

इन दोनों परिभाषाओं परोक्ष ही हैं

class OuterClass 
{ 
    private InnerClass innerClass 

    public int M_A 
    { 
     get 
     { 
      if (this.innerClass != null) 
      { 
       return this.innerClass.M_A; 
      } 
      else 
      { 
       throw new InvalidOperationException(); 
      } 
     } 
     set 
     { 
      if (this.innerClass != null) 
      { 
       this.innerClass.M_A = value; 
      } 
      else 
      { 
       throw new InvalidOperationException(); 
      } 
     } 
    } 
} 
+0

मुझे यकीन नहीं है कि यह तब तक कैसे लागू होता है जब तक कि मैं प्रश्न का हिस्सा नहीं चूक जाता ... क्या वह वह पूछ रहा था? –

+0

बस उत्सुक - आप गेटटर पर एक अमान्य ऑपरेशन अपवाद क्यों फेंक देंगे? मैं समझता हूं कि आप इसेटर में क्यों करेंगे, लेकिन क्या आप आमतौर पर गेटटर को निष्क्रिय नहीं मानेंगे? – BenAlabaster

+0

मैंने प्रश्न पूछा "[...] बाहरी क्लास के आंतरिक क्लास सदस्य के लिए गेटर और सेटर?" एक अतिरिक्त "एस" के रूप में "[...] बाहरी क्लास के आंतरिक क्लास सदस्य एस?", लेकिन केवल मेरे जवाब को खत्म करने के बाद regonized। –

21

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

+0

निहित गेटर्स और सेटर्स के लिए +1 – BobTheBuilder

+2

... यह मेरे उत्तर से अलग कैसे है? –

+1

इसके अलावा, वह सी #/.NET के संस्करण का कोई संकेत नहीं देता है जिसका वह उपयोग कर रहा है। लागू गुण केवल .NET 3.5/C# 3.0 का हिस्सा हैं। –