.net - Clases privadas anidadas
vb.net oop (3)
Quiero crear una clase anidada que solo pueda ser visible e instanciada desde la clase principal.
Pero también quiero poder usar una instancia de la clase anidada a través de una variable pública de la clase padre.
Intenté hacer privada la clase anidada o hacer que el constructor de la clase anidada fuera privado, pero no se compilará.
¿Es posible hacer esto en .NET?
Esto compila y funciona, pero la clase anidada puede ser utilizada por cualquiera:
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
No puede tener una clase anidada privada que también esté expuesta a través de una interfaz pública.
Es una o ambas proposiciones: la clase anidada es privada o no lo es.
Una opción es declarar una interfaz con el contrato que desea que implemente la clase anidada (con algunas herramientas de refactorización puede extraer una interfaz de una clase) y exponer la interfaz, manteniendo la clase anidada en privado.
Normalmente, la clase anidada privada implementa una interfaz o hereda otra clase, y la clase interfaz / base queda expuesta. Esto es útil cuando desea ocultar la implementación a la clase principal. Algo como esto:
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
Si solo intenta evitar que los clientes usen su objeto fuera de su biblioteca, simplemente haga que el constructor sea friend
. De esa forma, solo el código de tu Asamblea puede crear el objeto.