.NET

2011-01-20 5 views
8

में गुणों के लिए नेस्टेड क्लास एक्सेस विधियां मैं एक नेस्टेड क्लास में प्रॉपर्टी सेट करने और गुणों के लिए सर्वोत्तम दृष्टिकोण जानने का प्रयास कर रहा हूं।.NET

मेरे पास एक कक्षा है, कार जिसमें एक नेस्टेड क्लास ControlPanel है और केवल नियंत्रण कक्ष के गुणों को कार और नियंत्रण कक्ष वर्ग तक पहुंचाना चाहता है।

(यानी: असेंबली या नामस्थान के भीतर नहीं और आवेदन के भीतर कक्षा पुस्तकालय का उपयोग नहीं किया जाएगा) ... मैंने क्लास एक्सेस गुणों को दोस्त, संरक्षित मित्र, निजी, सार्वजनिक, लेकिन किसी भी व्यक्ति में बदल दिया है संयोजन मेरे अपेक्षित परिणामों से मेल नहीं खाता है।

मैं नीचे दिखाए गए वर्ग के ड्राइव() उप में गुणों को बदलना चाहता हूं।

किसी भी विचार?

Public Class Car 

    Dim cp As New ControlPanel 

    Public Class ControlPanel 
     Private _Speedometer As Integer = 0 
     Private _Odometer As Integer = 0 

     Public Property Speedometer() As Integer 
     Get 
      Return _Speedometer 
     End Get 
     Protected Set(ByVal value As Integer) 
      _Speedometer = value 
     End Set 
     End Property 

     Public Property Odometer() As Integer 
     Get 
      Return _Odometer 
     End Get 
     Protected Set(ByVal value As Integer) 
      _Odometer = value 
     End Set 
    End Property 

    End Class 

    Public Sub Drive() 

     cp.Odometer = 76323 
     co.Speedometer = 86 

    End Sub 

End Class 
+0

क्या आप अपने प्रश्न पर विस्तार कर सकते हैं? क्या आप * संपूर्ण कंट्रोलपैनल क्लास * को पहुंचने योग्य नहीं चाहते हैं, या क्या आप चाहते हैं * केवल उन दो गुणों * कार के अलावा किसी भी वर्ग से, पहुंच योग्य नहीं हो? साथ ही, आपका कोड यह सुझाव देता है कि आप गेटर और सेटर के लिए अलग-अलग पहुंच चाहते हैं, लेकिन आप इस सवाल में स्पष्ट रूप से यह नहीं बताते हैं। क्या आप गेटर और सेटर के लिए भी अलग-अलग पहुंच चाहते हैं? – Cheeso

+0

भ्रम के लिए क्षमा चाहता है। मैं क्या देखना चाहता हूं कि नियंत्रण कक्ष को कार वर्ग के बाहर से पढ़ा जाना है, लेकिन कार और नियंत्रण कक्ष कक्षाओं में पढ़ें/लिखें। –

+0

उस टिप्पणी के आधार पर, जो मुझे लगता है कि आप जो खोज रहे हैं वह वह है जो मैंने निजी नेस्टेड क्लास के साथ सुझाया था जिसमें सार्वजनिक (या मित्र) इंटरफ़ेस है। इससे यह सुनिश्चित होगा कि कार क्लास कंट्रोलपैनल पर सभी सदस्यों तक पहुंच सकती है, लेकिन बाहर केवल आईकंट्रोलपैनल के संदर्भ में ही होगा जो केवल प्राप्त होने का खुलासा करेगा। यदि कार के अलावा कुछ अन्य कंट्रोलपैनल क्लास को कम कर सकता है, तो आपको कुछ प्रकार की फ़ैक्टरी विधि (बनाएं) की आवश्यकता हो सकती है जो आईसींट्रोलपैनल लौटाती है। –

उत्तर

3

आप इस तरह यह कर सकते हैं:

Public Class Car 

    Private Interface IControlPanel 
    Property Odometer As Integer 
    Property Speedometer As Integer 
    End Interface 

    Public Class ControlPanel 
    Implements IControlPanel 
    Public ReadOnly Property Odometer As Integer 
     Get 
     Return CType(Me, IControlPanel).Odometer 
     End Get 
    End Property 
    Public ReadOnly Property Speedometer As Integer 
     Get 
     Return CType(Me, IControlPanel).Speedometer 
     End Get 
    End Property 
    Private Property IControlPanel_Odometer As Integer Implements IControlPanel.Odometer 
    Private Property IControlPanel_Speedometer As Integer Implements IControlPanel.Speedometer 
    End Class 

    Dim cp As IControlPanel = New ControlPanel() 

    Public Sub Drive() 
    cp.Odometer = 76323 
    cp.Speedometer = 86 
    End Sub 

End Class 

यह ControlPanel में निजी तौर पर लागू किया और एलियास के सदस्यों के साथ Car वर्ग में नेस्ट एक निजी इंटरफ़ेस का उपयोग करता। इस तरह, केवल Car इंटरफ़ेस सदस्यों तक पहुंच सकते हैं।

+1

आपकी प्रतिक्रिया के लिए बहुत धन्यवाद। –

0

सबसे पहले, शब्दावली को स्पष्ट करें। आप यहां किस बारे में बात कर रहे हैं वह एक "नेस्टेड" वर्ग है और उप-वर्ग

मुझे विश्वास नहीं है कि आप क्या करने की कोशिश कर रहे हैं .NET में संभव है। हालांकि, क्या आपको वास्तव में इसकी आवश्यकता है? यदि सीपी कार के भीतर निजी है, तो कोई भी उस कार के नियंत्रण कक्ष पर ओडोमीटर बढ़ा सकता है। वे अपना स्वयं का कंट्रोल पैनेल बना सकते हैं जो कि कार का हिस्सा नहीं है और उसके साथ गड़बड़ है, लेकिन इसमें क्या नुकसान है?

+0

मैंने कंट्रोलपैनल प्राइवेट बनाया है, लेकिन कार क्लास में एक संपत्ति इसे उपलब्ध कराता है। यानी: (MyCar.ControlPanel.Odometer) –

4

के रूप में रॉबर्ट लेवी ने कहा, यदि आप एक "नेस्टेड कक्षा" और नहीं एक "उपवर्ग" की बात कर रहे आदि

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

Public Class Car 

    Dim cp As New ControlPanel 

    Private Class ControlPanel 

    Public Property Speedometer As Integer 
    Public Property Odometer As Integer 

    End Class 

    Public Sub Drive() 
    cp.Odometer = 76323 
    cp.Speedometer = 86 
    End Sub 

End Class 

वैकल्पिक रूप से ...

Friend Interface IControlPanel 
    //Whatever actually needs to be publically accessible.  
End Interface 

// Other Code... 

Private Class ControlPanel 
    Implements IControlPanel 

// Other Code... 

लक्ष्य है कि आप एपीआई के संदर्भ में प्राप्त करने के लिए कोशिश कर रहे हैं क्या है?

+0

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

0

अपने ControlPanel कक्षा निजी और इसकी संपत्तियों को सार्वजनिक बनाएं। ControlPanel कक्षा केवल Car प्रकार के लिए दृश्यमान होगी, लेकिन Car अभी भी ControlPanel गुणों को संशोधित करने में सक्षम होंगे।

+0

नियंत्रण कक्ष अभी भी सार्वजनिक रूप से कार वर्ग के बाहर सार्वजनिक रूप से उपलब्ध होना चाहिए। कंट्रोल पैनल को कंट्रोलपैनल को पढ़ने/लिखने के लिए एबी होना चाहिए। –

+0

ओडोमीटर और स्पीडोमीटर के मान भी प्लेसहोल्डर मान हैं। इन क्षेत्रों को डेटाबेस से जोड़ा जाएगा और अनुरोध पर प्रदर्शित किया जा सकता है। (यानी: MyCar.ControlPanel.Speedometer) –

0

नेस्टेड कक्षाएं जाने का एक तरीका है या आप अपनी कार को समग्र श्रेणी के रूप में प्राप्त कर सकते हैं। कंट्रोल पैनल का इस्तेमाल कई अलग-अलग कारों (उप-वर्गों) में किया जा सकता है, इसलिए इसे घोंसला क्यों बनाया जाए? कार में एक नियंत्रण कक्ष है। कार में एक इंजन है

बस: कार में भी चीजें हैं।

रेडियो कुछ ऐसा हो सकता है जो नियंत्रण कक्ष में हो।स्पीडोमीटर डैशबोर्ड का हिस्सा हो सकता है जो कि नियंत्रण कक्ष का भी हिस्सा हो सकता है।

तो फिर तुम साथ

MyCar.ItsControlPanel.Radio MyCar.ItsControlPanel.Dashboard.Speedometer.CurrentSpeed ​​अंत;

मोटरसाइकिल के बारे में कैसे? यह एक कार नहीं है लेकिन इसमें अभी भी एक डैशबोर्ड है जिसमें स्पीडोमीटर है।

मेरा मुद्दा प्राप्त करें? समग्र वस्तुओं।

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