2011-01-20 13 views
8

Estoy tratando de encontrar el mejor enfoque para configurar y obtener propiedades en una clase anidada que estoy creando.Clase anidada Métodos de acceso para Propiedades en .NET

Tengo una clase, Coche que tiene una clase anidada ControlPanel y quiero hacer que las propiedades del Panel de control solo sean accesibles para la clase Coche y Panel de control.

(es decir: no dentro del ensamblado o espacio de nombres y no dentro de la aplicación se usará la biblioteca de clases) ... He cambiado las propiedades de acceso de clase a amigo, amigo protegido, privado, público, pero cualquier la combinación no coincide con mis resultados esperados.

Quiero cambiar las propiedades en la unidad() Sub de una clase como se muestra a continuación.

¿Alguna 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

¿Puede ampliar su pregunta? ¿Desea que * toda la clase ControlPanel * sea inaccesible, o desea * que esas dos propiedades * sean inaccesibles, de cualquier clase que no sea el automóvil? Además, su código parece sugerir que desea acceso diferente para el captador y el colocador, pero no lo dice claramente en la pregunta. ¿Desea un acceso diferente para getter y setter también? – Cheeso

+0

Se disculpa por la confusión. Lo que me gustaría ver es que el Panel de Control sea de solo lectura desde fuera de la clase de Coche, pero de Lectura/Escritura en las clases de Automóvil y Panel de Control. –

+0

Basado en ese comentario, lo que creo que estás buscando es lo que sugerí con una clase privada anidada que tiene una interfaz pública (o amiga). Esto asegurará que la clase Car pueda acceder a todos los miembros en ControlPanel, pero el exterior solo se aferrará a una referencia de IControlPanel que solo expondría los get. Si algo que no sea Automóvil puede insanar la clase ControlPanel, es posible que necesite alguna forma de método de fábrica (Crear) que devuelva IControlPanel. –

Respuesta

3

Puede hacerlo de esta manera:

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 

Se utiliza un interfaz privada anidado en la clase Car con miembros implementadas y con alias privada en ControlPanel. De esta manera, solo Car puede acceder a los miembros de la interfaz.

+1

Muchas gracias por su respuesta. –

0

Primero, aclaremos la terminología. De lo que está hablando aquí es una clase "anidada" y no una subclase

No creo que lo que está intentando hacer sea posible en .NET. Sin embargo, ¿realmente lo necesitas? Si cp es privado dentro del automóvil, nadie puede incrementar el odómetro en el panel de control de ese automóvil. Podrían crear su propio panel de control que no sea parte de un automóvil y luego meterse con él, pero ¿cuál es el daño en eso?

+0

He hecho el ControlPanel Private, pero una propiedad en la clase Car lo hace disponible. es decir: (MyCar.ControlPanel.Odometer) –

4

Como Robert Levy señaló, se está refiriendo a un "anidado clase" y no una "subclase", etc.

En cuanto a la forma de lograr lo que busca ... simplemente está buscando para hacer ControlPanel una clase privada? Eso asegurará que todos los miembros de ControlPanel solo sean accesibles para el automóvil. Si tiene otros miembros en ControlPanel que necesitan estar expuestos, o el mundo exterior externo necesita mantener una referencia a ControlPanel de alguna manera, considere usar una interfaz para exponer solo a aquellos miembros que desea que estén disponibles públicamente.

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 

Opcionalmente ...

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

// Other Code... 

Private Class ControlPanel 
    Implements IControlPanel 

// Other Code... 

¿Cuál es la meta que usted está tratando de lograr en términos de API?

+0

El propósito que intento lograr es la modularidad. En lugar de crear 100 propiedades en el nivel de Coche, quiero romper las propiedades que se relacionan entre sí en estas clases de "carpeta". –

0

Haga que su clase ControlPanel sea privada y sus propiedades sean públicas. La clase ControlPanel solo será visible para el tipo Car, pero Car aún podrá modificar las propiedades de ControlPanel.

+0

El panel de control todavía debe estar a disposición del público como de solo lectura fuera de la clase de automóvil. El panel de control debe estar listo para leer/escribir en el Panel de Control. –

+0

Los valores para el cuentakilómetros y el velocímetro también son valores de marcador de posición. Estos campos se vincularán a una base de datos y se mostrarán previa solicitud. (es decir: MyCar.ControlPanel.Speedometer) –

0

clases anidadas es una manera de hacerlo o puede tener su automóvil como una clase compuesta. El panel de control puede usarse en muchos automóviles diferentes (subclases), entonces ¿por qué hacerlo anidado? El auto tiene un panel de control. El coche tiene un motor

Autobús: el coche también tiene esas cosas.

La radio puede ser algo que el Panel de control tiene.El velocímetro podría ser parte del Tablero que también puede ser parte del Panel de control.

Entonces se termina con

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

¿Qué tal la motocicleta? No es un automóvil, pero todavía tiene un Tablero que tiene un Velocímetro.

¿Entiendes? Objetos compuestos

Cuestiones relacionadas