Usando a Programação Orientada a Objetos, temos o poder de criar uma classe dentro de uma classe (uma classe aninhada), mas nunca criei uma classe aninhada nos meus 4 anos de experiência em codificação.
Para que servem as classes aninhadas?
Eu sei que uma classe pode ser marcada como privada se estiver aninhada e que podemos acessar todos os membros privados dessa classe a partir da classe que o contém. Poderíamos apenas colocar as variáveis como privadas na própria classe que os contém.
Então, por que criar uma classe aninhada?
Em quais cenários as classes aninhadas devem ser usadas ou são mais poderosas em termos de uso sobre outras técnicas?
c#
object-oriented
programming-practices
.net
class-design
mayur rathi
fonte
fonte
Respostas:
A principal característica das classes aninhadas é que elas podem acessar membros privados da classe externa enquanto possuem todo o poder de uma classe em si. Além disso, eles podem ser privados, o que permite um encapsulamento bastante poderoso em determinadas circunstâncias:
Aqui, travamos o setter completamente na fábrica, já que a classe é privada, nenhum consumidor pode fazer o downcast e acessar o setter, e podemos controlar completamente o que é permitido.
Fora isso, é útil para implementar interfaces de terceiros em um ambiente controlado, onde ainda podemos acessar membros privados.
Se, por exemplo, forneçamos uma instância de alguma interface para outro objeto, mas não queremos que nossa classe principal o implemente, podemos permitir que uma classe interna o implemente.
fonte
Outer
, você iria passar por umFunc<int>
, que seria apenas() => _example
Inner
não está aninhada einternal
não funciona (ou seja, quando você não está lidando com assemblies diferentes). A legibilidade atingida pelas classes de aninhamento o torna menos favorável do que o usointernal
(sempre que possível).Normalmente, uma classe aninhada N é criada dentro de uma classe C sempre que C precisa usar algo internamente que nunca deve ser (diretamente) usado fora de C, e por qualquer motivo que algo precise ser um novo tipo de objeto em vez de algum existente tipo.
Acredito que isso geralmente acontece implementando um método que retorna um objeto implementando alguma interface, e queremos manter o tipo concreto desse objeto oculto, porque não será útil em nenhum outro lugar.
A implementação de IEnumerable é um bom exemplo disso:
Simplesmente não há razão para alguém de fora
BlobOfBusinessData
saber ou se importar com oBusinessDatumEnumerator
tipo de concreto , portanto é melhor mantê-lo dentro de casaBlobOfBusinessData
.Isso não era para ser um exemplo de "melhores práticas" de como implementar
IEnumerable
corretamente, apenas o mínimo necessário para transmitir a idéia, então deixei de fora as coisas como umIEnumerable.GetEnumerator()
método explícito .fonte
Node
classe em aLinkedList
. Qualquer pessoa que use oLinkedList
não se importa com aNode
implementação, desde que possa acessar o conteúdo. A única entidade que se importa é aLinkedList
própria classe.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
Se você decidir passar
Node
para o mesmo escopoLinkedList
, você teráLinkedListNode
é improvável que seja útil sem aLinkedList
própria classe. Mesmo que sejamLinkedList
fornecidas algumas funções que retrocedam umLinkedListNode
objeto que um usuárioLinkedList
possa usar, ele ainda seráLinkedListNode
útil apenas quandoLinkedList
for usado. Por esse motivo, tornar a classe "node" uma classeLinkedList
semelhante está poluindo o escopo que a contém.fonte
Eu uso classes públicas aninhadas para classes auxiliares relacionadas.
Use-os para variações relacionadas.
O chamador pode escolher qual versão é adequada para qual problema. Às vezes, uma classe não pode ser totalmente construída em uma única passagem e requer uma versão mutável. Isso sempre é verdade ao manipular dados cíclicos. Mutables podem ser convertidos para somente leitura posteriormente.
Eu os uso para registros internos
fonte
A classe aninhada pode ser usada sempre que você desejar criar mais de uma instância da classe ou sempre que desejar tornar esse tipo mais disponível.
A classe aninhada aumenta os encapsulamentos e também leva a códigos mais legíveis e de manutenção.
fonte