2012-06-07 14 views
5

मैं एक नेस्टेड क्लास बनाना चाहता हूं जो केवल अभिभावक वर्ग से दिखाई दे और तत्काल दिखाई दे।
लेकिन मैं भी अभिभावक वर्ग के सार्वजनिक चर के माध्यम से नेस्टेड कक्षा के उदाहरण का उपयोग करने में सक्षम होना चाहता हूं।
मैंने नेस्टेड क्लास को निजी बनाने, या नेस्टेड क्लास के कन्स्ट्रक्टर को निजी बनाने की कोशिश की, लेकिन यह संकलित नहीं होगा।
क्या यह .NET में ऐसा करना संभव है?निजी नेस्टेड कक्षाएं

यह संकलित करता है तथा काम करता है, लेकिन नेस्टेड वर्ग किसी के द्वारा इस्तेमाल किया जा सकता:

Public Class OuterClass 
     Public X As Integer = 123 
     Public NestedClassInstance As New NestedClass(Me) 

     Public Class NestedClass 
      Private Parent As OuterClass 

      Public Sub New(ByVal _Parent As OuterClass) 
       Parent = _Parent 
      End Sub 

      Public Sub GetParentX() 
       Debug.WriteLine("X = " & Parent.X.ToString) 
      End Sub 
     End Class 
    End Class 

    Sub Main() 
     Dim OuterClassInstance As New OuterClass 
     OuterClassInstance.NestedClassInstance.GetParentX() 
    End Sub 
+0

एकमात्र चीज जो नेस्टेड क्लास के बारे में विशेष है वह यह है कि यह उस श्रेणी के निजी और संरक्षित सदस्यों तक पहुंच सकती है (बशर्ते इसका एक संदर्भ हो)। क्या यह नेस्टेड क्लास की कार्यक्षमता है जिसकी आपने परवाह की थी या आप कुछ और करने की कोशिश कर रहे थे? –

+0

अधिकांशतः मैं नेस्टेडिसेंस से नेस्टेड क्लास को बाहर रखने की कोशिश कर रहा हूं, और एक बीमा भी है जिसे माता-पिता वर्ग को छोड़कर तत्काल नहीं किया जा सकता है। – mcu

+0

मेरे लिए, नेस्टेड निजी श्रेणी परिभाषा केवल होल्डिंग क्लास के लिए उपलब्ध होनी चाहिए, वैसे ही निजी चर हैं, जिसमें वे उस वर्ग के लिए निजी हैं। लेकिन अगर होल्डिंग क्लास इसे तुरंत चालू करती है और इसे होल्डिंग क्लास के अंदर सार्वजनिक चर के लिए असाइन करती है, तो उदाहरण होल्डिंग क्लास के क्षेत्र के रूप में किसी के लिए सुलभ होना चाहिए। यह सिर्फ मेरे लिए एक बहुत ही प्राकृतिक वस्तु व्यवहार की तरह लगता है। ओह अच्छा। – mcu

उत्तर

6

आम तौर पर निजी नेस्टेड कक्षा एक इंटरफ़ेस लागू करती है या किसी अन्य वर्ग को प्राप्त करती है, और इंटरफ़ेस/बेस क्लास का खुलासा किया जाता है। यह तब उपयोगी होता है जब आप मूल वर्ग में कार्यान्वयन को छिपाना चाहते हैं। कुछ इस तरह:

Module EntryPoint 
    Sub Main() 
     Dim OuterClassInstance As New OuterClass 
     OuterClassInstance.NestedClassInstance.GetParentX() 
    End Sub 
End Module 

Public Class OuterClass 
    Public X As Integer = 123 
    Public NestedClassInstance As ISomeImplementation = New NestedClass(Me) 

    Private Class NestedClass 
     Implements ISomeImplementation 
     Private Parent As OuterClass 

     Public Sub New(ByVal _Parent As OuterClass) 
      Parent = _Parent 
     End Sub 

     Public Sub GetParentX() Implements ISomeImplementation.GetParentX 
      Debug.WriteLine("X = " & Parent.X.ToString) 
     End Sub 
    End Class 
End Class 

Public Interface ISomeImplementation 
    Sub GetParentX() 
End Interface 
+0

यह अधिकांश भाग के लिए काम करता है, धन्यवाद। यह सिर्फ एक कमी है जो मैंने पाया। अगर नेस्टेड क्लास में सार्वजनिक क्षेत्र हैं, तो मैं उन्हें इंटरफ़ेस के माध्यम से उपयोग नहीं कर सकता जब तक कि मैं उन्हें गुणों के रूप में लागू नहीं करता। – mcu

+0

मैंने पैरेंट क्लास के अंदर इंटरफेस भी ले जाया। यह इसे अधिक आत्मनिर्भर बना दिया। – mcu

3

आप एक निजी नेस्टेड वर्ग है कि यह भी एक सार्वजनिक इंटरफेस के माध्यम से सामने आ रहा है नहीं हो सकता।

यह या तो एक या प्रस्ताव है - या तो घोंसला वर्ग निजी है, या यह नहीं है।

एक विकल्प अनुबंध के साथ एक इंटरफेस घोषित करना है जिसे आप नेस्टेड क्लास को कार्यान्वित करना चाहते हैं (कुछ रिफैक्टरिंग टूल्स के साथ आप कक्षा से इंटरफ़ेस निकाल सकते हैं) और नेस्टेड क्लास को निजी रखते हुए इंटरफ़ेस का पर्दाफाश करते हैं।

0

तुम सिर्फ अपने पुस्तकालय के बाहर अपने वस्तु का उपयोग कर तो बस निर्माता friend बनाने से ग्राहकों को रखने की कोशिश कर रहे हैं। इस तरह आपकी असेंबली में केवल कोड ही वस्तु बना सकता है।

+0

हम्म, मैंने एक निजी निर्माता का उपयोग करने की कोशिश की, लेकिन फिर मूल वर्ग इसे तुरंत चालू नहीं कर सका। – mcu

+0

फिर दोस्त का प्रयोग करें। मैं अपना जवाब संपादित करूंगा। – tcarvin

+0

दोस्त असेंबली तक पहुंच को सीमित करता है, इसलिए यह ओपी –

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