Então, por que criar uma classe aninhada?
Eu posso pensar em algumas razões importantes:
1. Ativar encapsulamento
Muitas vezes, as classes aninhadas são detalhes de implementação da classe. Os usuários da classe principal não devem se preocupar com sua existência. Você deve poder alterá-los à vontade, sem exigir que os usuários da classe principal alterem seu código.
2. Evite a poluição do nome
Você não deve adicionar tipos, variáveis, funções etc. em um escopo, a menos que sejam apropriados nesse escopo. Isso é ligeiramente diferente do encapsulamento. Pode ser útil expor a interface de um tipo aninhado, mas o local apropriado para o tipo aninhado ainda é a classe principal. No território C ++, os tipos de iteradores são um exemplo. Eu não sou experiente em C # o suficiente para lhe dar exemplos concretos.
Vamos criar um exemplo simplista para ilustrar por que mover uma classe aninhada para o mesmo escopo da classe principal é poluição por nome. Digamos que você esteja implementando uma classe de lista vinculada. Normalmente, você usaria
publid class LinkedList
{
class Node { ... }
// Use Node to implement the LinkedList class.
}
Se você decidir passar Nodepara o mesmo escopo LinkedList, você terá
public class LinkedListNode
{
}
public class LinkedList
{
// Use LinkedListNode to implement the class
}
LinkedListNodeé improvável que seja útil sem a LinkedListprópria classe. Mesmo que sejam LinkedListfornecidas algumas funções que retrocedam um LinkedListNodeobjeto que um usuário LinkedListpossa usar, ele ainda será LinkedListNodeútil apenas quando LinkedListfor usado. Por esse motivo, tornar a classe "node" uma classe LinkedListsemelhante está poluindo o escopo que a contém.