2011-02-11 36 views
11

Estoy aprendiendo C# y provengo de un mundo Java, estaba un poco confundido al ver que C# no tiene un "paquete privado". La mayoría de los comentarios que he visto sobre esta cantidad son "No se puede hacer, el idioma no se diseñó de esta manera". También vi algunas soluciones que incluyen internal y partial junto con comentarios que dicen que estas soluciones alternativas van en contra del diseño del idioma.¿Por qué C no tiene paquete privado?

¿Por qué se diseñó C# de esta manera? Además, ¿cómo haré algo como lo siguiente? Tengo una clase Product y una clase ProductInstance. La única forma en que quiero que se cree un ProductInstance es mediante un método de fábrica en la clase Product. En Java, pondría ProductInstance en el mismo paquete que Product, pero hago su constructor package private para que solo Product tenga acceso a él. De esta manera, cualquiera que quiera crear un ProductInstance solo puede hacerlo a través del método de fábrica en la clase Product. ¿Cómo lograría lo mismo en C#?

+1

Haga que el constructor de clases del producto sea privado, luego tenga una función estática pública que devuelva una instancia del producto, por ejemplo: var p = Product.GetProductInstance –

+1

Al ver las respuestas, no veo respuesta al por qué. Siento que es un gran olor a código establecer un método "interno" en el que está destinado a ser utilizado solo por unas pocas clases "amigables" (ver la palabra clave 'friend' en C++). No quiero dividir mi aplicación en cientos de dll solo para evitar el acceso maloliente, ni me gusta dejar abierta la implementación de mis detalles (básicamente pública para todo el equipo de desarrollo). ¿Debo escribir clases gigantes con diez subclases para superar esta limitación? – PPC

Respuesta

25

internal es lo que buscas. Significa que el miembro es accesible por cualquier clase en el mismo conjunto. No hay nada de malo en usarlo para este propósito (Producto & ProductInstance), y es una de las cosas para las que fue diseñado. C# eligió no crear espacios de nombres significativos: se utilizan para la organización, no para determinar qué tipos se pueden ver, como en java con el paquete privado.

partial no es nada en absoluto como internalopackage private. Es simplemente una manera de dividir la implementación de una clase en múltiples archivos, con algunas opciones de extensibilidad para una buena medida.

+0

¿Debo marcar el constructor 'ProductInstance' como' interno'? –

+0

@Vivin, sí, y presumiblemente la clase también. –

+0

No, crear un ensamblaje para una sola clase de fábrica es un mal consejo. Tener cientos de ensambles hace que un proyecto sea difícil de manejar. – miguel

7

Los paquetes no existen realmente de la misma manera que lo hacen en Java. Los espacios de nombre se utilizan para organizar el código y evitar el nombramiento de conflictos, pero no para el control de acceso. Los proyectos/ensambles se pueden usar para el control de acceso, pero no se pueden tener proyectos/ensamblajes anidados como se puede hacer con los paquetes.

Usa internal para ocultar los miembros de un proyecto de otro.

Cuestiones relacionadas