.net vb.net oop class nested

.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.