2010-07-13 17 views
7

Siempre me pregunto si es posible tener una clase privada ? Y, ¿cuál sería el sentido de tener esa clase?¿Es posible tener una clase privada?

Gracias por ayudarnos.

+0

posible duplicado de [¿Por qué/cuándo debería usar clases anidadas en .net? ¿O no debería?] (Http://stackoverflow.com/questions/48872/why-when-should-you-use-nested-classes-in-net-or-shouldnt-you) – nawfal

Respuesta

19

Sí, es posible tener una clase privada, pero sólo como una clase interna de otra clase:

public class Outer 
{ 
    private class Inner 
    {} 
} 

Esto suele ser útil cuando se desea encapsular cierta lógica dentro de una clase (la exterior), pero necesita un diseño de código más estructurado/OO para implementarlo. He utilizado este patrón en el pasado cuando necesito una clase contenedor para procesar cierta información dentro de un método de una clase, pero la clase contenedor no tiene significado fuera de esta lógica. Convertir la clase contenedora en una clase interna privada significa que su uso está localizado en la clase externa que lo utiliza.

Vale la pena señalar que con esta estructura, la clase interna tiene acceso a los miembros privados de la clase externa, pero no al revés.

+0

Puede usar esto con el patrón NullObject (http://en.wikipedia.org/wiki/Null_Object_pattern) y luego las clases de sus clientes nunca sabrán que hay otra clase de la que preocuparse. –

2

Sí, por lo general, son clases anidadas dentro de otro tipo. Esto significa que puede agregar lógica en una clase anidada sin exponer la clase a nada más. Internal también es útil para clases anidadas.

Sin embargo, tenga en cuenta que hay algunos argumentos en contra de un diseño que requiere clases anidadas, aunque tiendo a usarlos cuando parecen una buena opción.

2

Puedes tener una clase privada, dentro de otra clase.

Puede usar una clase privada para encapsular la lógica y la implementación. Por ejemplo, puede declarar una implementación de un iterador en su implementación de ICollection.

3

Tener clases privadas no anidadas (Solo visibles para su espacio de nombres y espacios de nombres secundarios) permitiría limpiar los límites del código mientras se programa en el mismo conjunto.

Teniendo por ejemplo solo una interfaz y una fábrica visibles desde otros espacios de nombres en el mismo ensamblaje mientras todavía tienen toda la implementación de la interfaz y clases de utilidad (que nadie tiene conocimiento del espacio de nombres).

Todavía es posible hacerlo de alguna manera con una gran clase parcial reemplazando un espacio de nombres y clases anidadas en el interior, pero es un hack muy malo y las pruebas unitarias se vuelven casi imposibles.

+0

+1 para el comentario del espacio de nombres. –

+0

Esta respuesta contradice sus dos primeras líneas: http://stackoverflow.com/a/6776502/733152, ¿puede borrar la confusión? , Gracias –

+0

@ Mr.Anubis Lee la pregunta por favor. Estaba respondiendo el segundo punto sobre cuál sería la utilidad de las clases privadas si existieran especialmente, si fueran espacios de nombres privados. Como el "would" en mi primera línea expresa, esta característica no está en la especificación C# actual. –

Cuestiones relacionadas