Tipos aninhados (Guia de Programação em C#)
Um tipo definido em uma classe, um struct ou uma interface é chamado de tipo aninhado. Por exemplo
public class Container
{
class Nested
{
Nested() { }
}
}
Independentemente de o tipo externo ser uma classe, uma interface ou uma struct, os tipos aninhados são privados por padrão, acessíveis somente por meio do tipo que contêm. No exemplo anterior, a classe Nested
é 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 public, protected, internal, protected internal, private ou private protected.
No entanto, a definição de uma classe aninhada
protected
,protected internal
ouprivate protected
dentro de uma classe selada gera um aviso do compilador CS0628, "novo membro protegido declarado na 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".
Tipos aninhados de um struct podem ser públicos, internos ou particulares.
O exemplo a seguir torna a classe Nested
pública:
public class Container
{
public class Nested
{
Nested() { }
}
}
O tipo aninhado ou interno pode acessar o tipo recipiente ou externo. Para acessar o tipo recipiente, passe-o como um argumento ao 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 acessíveis ao seu tipo recipiente. Ele pode acessar membros privados e protegidos do tipo recipiente, 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();