Entonces, ¿por qué crear una clase anidada?
Puedo pensar en un par de razones importantes:
1. Habilitar la encapsulación
Muchas veces las clases anidadas son detalles de implementación de la clase. Los usuarios de la clase principal no deberían tener que preocuparse por su existencia. Debería poder cambiarlos a voluntad sin requerir que los usuarios de la clase principal cambien su código.
2. Evitar la contaminación del nombre
No debe agregar tipos, variables, funciones, etc. en un ámbito a menos que sean apropiados en ese ámbito. Esto es ligeramente diferente de la encapsulación. Podría ser útil exponer la interfaz de un tipo anidado, pero el lugar adecuado para el tipo anidado sigue siendo la clase principal. En C ++ land, los tipos de iterador son un ejemplo de ello. No tengo experiencia en C # lo suficiente como para darle ejemplos concretos.
Hagamos un ejemplo simplista para ilustrar por qué mover una clase anidada al mismo alcance que la clase principal es la contaminación del nombre. Digamos que está implementando una clase de lista vinculada. Normalmente, usarías
publid class LinkedList
{
class Node { ... }
// Use Node to implement the LinkedList class.
}
Si decide Node
subir al mismo alcance que LinkedList
, tendrá
public class LinkedListNode
{
}
public class LinkedList
{
// Use LinkedListNode to implement the class
}
LinkedListNode
es poco probable que sea útil sin la LinkedList
clase misma. Incluso si se LinkedList
proporcionan algunas funciones que devuelven un LinkedListNode
objeto que un usuario LinkedList
podría usar, sigue siendo LinkedListNode
útil solo cuando LinkedList
se usa. Por esa razón, hacer que la clase "nodo" sea una clase de igual LinkedList
es contaminar el alcance que contiene.