2011-01-20 13 views
8

Sto cercando di individuare l'approccio migliore per l'impostazione e il recupero delle proprietà in una classe nidificata che sto creando.Classe nidificata Metodi di accesso per le proprietà in .NET

Ho una classe, Car che ha una classe nidificata ControlPanel e desidera rendere le proprietà del Pannello di controllo accessibili solo per la classe Car e Pannello di controllo.

(vale a dire: non all'interno dell'assembly o del namespace e non all'interno dell'applicazione verrà utilizzata la libreria di classi) ... Ho modificato le proprietà di accesso di classe ad amici, amici protetti, privati, pubblici, ma qualsiasi la combinazione non corrisponde ai risultati attesi.

Desidero modificare le proprietà nel sotto Drive() di una classe come mostrato di seguito.

Qualche idea?

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

Puoi espandere la tua domanda? Vuoi che * l'intera classe ControlPanel * sia inaccessibile, o vuoi * solo che queste due proprietà * siano inaccessibili, da qualsiasi classe diversa da Car? Inoltre, il tuo codice sembra suggerire di volere un accesso diverso per il getter e setter, ma non lo dichiari chiaramente nella domanda. Vuoi un accesso diverso anche per getter e setter? – Cheeso

+0

Si scusa per la confusione. Quello che mi piacerebbe vedere è che il ControlPanel sia di sola lettura al di fuori della classe Car, ma Read/Write nelle classi Car e Control Panel. –

+0

Sulla base di quel commento, quello che penso tu stia cercando è quello che avevo suggerito con una classe nidificata privata che ha un'interfaccia pubblica (o di un amico). Ciò garantirà che la classe Car possa accedere a tutti i membri su ControlPanel, ma l'esterno rimarrà solo su un riferimento di IControlPanel che esporrà solo l'ottiene. Se qualcosa di diverso da Car può insanire la classe ControlPanel, potrebbe essere necessario un qualche metodo di fabbrica (Crea) che restituisca IControlPanel. –

risposta

3

Si può fare in questo modo:

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 

Esso utilizza un'interfaccia privata nidificato nella classe Car con i membri attuate privatamente e con alias in ControlPanel. In questo modo, solo Car può accedere ai membri dell'interfaccia.

+1

Mille grazie per la tua risposta. –

0

In primo luogo, chiariamo la terminologia. Quello di cui stai parlando è una classe "annidata" e non una sottoclasse

Non credo che ciò che stai cercando di fare sia possibile in .NET. Tuttavia, ne hai davvero bisogno? Se cp è privato all'interno di Car, nessuno può incrementare l'odometro sul pannello di controllo della macchina. Potrebbero creare il proprio pannello di controllo che non fa parte di un'auto e quindi fare confusione con esso, ma qual è il danno in questo?

+0

Ho reso privato ControlPanel, ma una proprietà nella classe Car lo rende disponibile. es .: (MyCar.ControlPanel.Odometer) –

4

Come Robert Levy ha sottolineato, si fa riferimento ad una "classe annidata" e non una "sottoclasse", ecc

Per quanto riguarda come ottenere quello che state cercando ... siete semplicemente cercando di fare ControlPanel una classe privata? Ciò garantirà che tutti i membri di ControlPanel siano accessibili solo a Car. Se si dispone di altri membri su ControlPanel che devono essere esposti, o il mondo esterno deve tenere un riferimento a ControlPanel in qualche modo, considerare l'utilizzo di un'interfaccia per esporre solo i membri che si desidera siano disponibili pubblicamente.

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 

Opzionalmente ...

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

// Other Code... 

Private Class ControlPanel 
    Implements IControlPanel 

// Other Code... 

Qual è l'obiettivo che si sta tentando di raggiungere in termini di API?

+0

Lo scopo che sto cercando di ottenere è la modularità. Invece di creare 100 proprietà a livello di auto, voglio rompere le proprietà correlate tra loro in queste classi di "cartelle". –

0

Rendi la tua classe ControlPanel privata e le sue proprietà pubbliche. La classe ControlPanel sarà quindi visibile solo al tipo Car, ma Car sarà ancora in grado di modificare le proprietà di ControlPanel.

+0

Il pannello di controllo dovrebbe essere ancora disponibile pubblicamente come readonly al di fuori della classe Car. Il pannello di controllo dovrebbe essere in grado di leggere/scrivere su ControlPanel. –

+0

I valori per contachilometri e tachimetro sono anche valori segnaposto. Questi campi saranno collegati a un database e visualizzabili su richiesta. (es: MyCar.ControlPanel.Speedometer) –

0

le classi annidate sono un modo per andare o puoi avere la tua auto come una classe composita. Il pannello di controllo può essere utilizzato in molte macchine diverse (sottoclassi), quindi perché farlo nidificare? La macchina ha un pannello di controllo. L'auto ha un motore

Bus: l'auto ha anche quelle cose.

La radio potrebbe essere qualcosa che il Pannello di controllo ha.Il tachimetro potrebbe far parte di Dashboard che può anche far parte del pannello di controllo.

poi si finisce con

MyCar.ItsControlPanel.Radio MyCar.ItsControlPanel.Dashboard.Speedometer.CurrentSpeed;

Che ne dici di moto? Non è un'auto ma ha ancora un cruscotto con tachimetro.

Ottenere il mio punto? Oggetti compositi

Problemi correlati