Tipos aninhados (Guia de Programação em C#)
Um tipo definido dentro de uma classe, struct ou interface é chamado de tipo aninhado. Por exemplo
public class Container
{
class Nested
{
Nested() { }
}
}
Independentemente de o tipo externo ser uma classe, interface ou struct, os tipos aninhados são padronizados para private, eles são acessíveis apenas a partir do tipo que o contém. No exemplo anterior, a Nested
classe é inacessível para tipos externos.
Você também pode especificar um modificador de acesso para definir a acessibilidade de um tipo aninhado, da seguinte maneira:
Os tipos aninhados de uma classe podem ser públicos, protegidos, internos, protegidos internos, privados ou privados.
No entanto, definir uma
protected
classe ,protected internal
ouprivate protected
aninhada dentro de uma classe selada gera aviso do compilador CS0628, "novo membro protegido declarado em classe selada".Lembre-se também de que tornar um tipo aninhado visível externamente viola a regra de qualidade de código CA1034 "Tipos aninhados não devem ser visíveis".
Os tipos aninhados de uma estrutura podem ser públicos, internos ou privados.
O exemplo a seguir torna a Nested
classe pública:
public class Container
{
public class Nested
{
Nested() { }
}
}
O tipo aninhado, ou interno, pode acessar o tipo de contenção, ou externo. Para acessar o tipo que contém, passe-o como um argumento para o construtor do tipo aninhado. Por exemplo:
public class Container
{
public class Nested
{
private Container? parent;
public Nested()
{
}
public Nested(Container parent)
{
this.parent = parent;
}
}
}
Um tipo aninhado tem acesso a todos os membros que são acessíveis ao seu tipo que o contém. Ele pode acessar membros privados e protegidos do tipo que contém, incluindo quaisquer membros protegidos herdados.
Na declaração anterior, o nome completo da classe Nested
é Container.Nested
. Este é o nome usado para criar uma nova instância da classe aninhada, da seguinte maneira:
Container.Nested nest = new Container.Nested();