2010-08-11 12 views
5

Puede alguien explicar, por lo que pueden hacer tal cosa y por qué necesitamos estaclases internas públicas

public class OuterClass 
{ 
    public class InnerClass 
    { 
    } 
} 

por eso que necesitamos pública interna sea cual sea: estructura, clase, enumeración o clase estática?

Creo que si es interior, entonces debe ser solo privado o protegido.

+0

¿Por qué cree "que si es interior de lo que debe ser solo privado o protegido "? – Jesper

+0

Quise decir que es lógico para MÍ, pero como la gente dice que a veces necesitamos esa funcionalidad – anderhil

Respuesta

12

En general no necesita tipos anidados públicos, pero a veces pueden ser útiles. Dejan muy en claro que un tipo está explícitamente asociado con otro.

Ellos también permiten que el tipo anidado acceda a los miembros privados del tipo adjunto (en C#), que a veces puede ser útil. Me gustaría Supongo que List<T>.Enumerator puede hacer eso, por ejemplo. En Java, las reglas de acceso funcionan al revés: la clase adjunta tiene acceso a los miembros privados de las clases anidadas.

Creo que tendría que explicar por qué querría explícitamente prohibir en lugar de por qué es necesario, como tal. No puedo pensar en ningún otro lado que pueda especificar un modificador de acceso, pero no puede hacerlo público, excepto por inconsistencia (declarando un método público con un tipo de devolución interna, por ejemplo).

+0

¡Joder, Jon! Realmente, impresionante explicación –

+0

Gracias por la respuesta, ahora está claro para mí. La razón por la que formulé esta pregunta, porque vi cómo nuestro desarrollador junior hizo enum anidado y luego lo usó como parámetro para el método de la clase. Entonces me parece extraño, porque nunca antes había visto ese código. OuterClass obj = new OuterClass(); obj.Method (OuterClass.InnerEnum.Value1); – anderhil

+1

"Buscar extraño" no es motivo para que se anule algo ;-) –

2

Considere este ejemplo:

public class TrainingFile { 

    public List<TrainingFileEntry> getEntries() { 
      return ... 
    } 

    public class TrainingFileEntry { 
     int x; 
     int y; 
    } 
} 

desea ocultar los detalles de la TrainingFileEntry, pero su cliente tiene que ser capaz de utilizarlo. Podría crear un archivo propio para esta clase anidada, pero dicha clase auxiliar anidada no es en su mayoría una "independiente" y está pegada a la clase donde está anidada. -)

+0

+1 en eso - uso algo como esto para ejemplificar mucho con los controles WPF, que pueden tener clases internas como ver partes (entradas de lista, etc.) .... mantiene el espacio de nombres real más limpio. – TomTom

0

Es muy útil cuando cada miembro de InnerClass realmente pertenece a uno, y solo a un miembro de la clase externa. He usado ese constructo en el que OuterClass era una colección de objetos matemáticos e InnerClass era los objetos mismos. en general, no se recomiendan

Cuestiones relacionadas