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 Node
para 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 LinkedList
própria classe. Mesmo que sejam LinkedList
fornecidas algumas funções que retrocedam um LinkedListNode
objeto que um usuário LinkedList
possa usar, ele ainda será LinkedListNode
útil apenas quando LinkedList
for usado. Por esse motivo, tornar a classe "node" uma classe LinkedList
semelhante está poluindo o escopo que a contém.