Zagnieżdżone typy (Przewodnik programowania w języku C#)
Typ zdefiniowany w klasie, struktury lub interfejsie jest nazywany typem zagnieżdżonym. Na przykład
public class Container
{
class Nested
{
Nested() { }
}
}
Niezależnie od tego, czy typ zewnętrzny jest klasą, interfejsem lub strukturą, typy zagnieżdżone są domyślnie prywatne; są dostępne tylko z ich typu zawierającego. W poprzednim przykładzie Nested
klasa jest niedostępna dla typów zewnętrznych.
Można również określić modyfikator dostępu, aby zdefiniować dostępność typu zagnieżdżonego w następujący sposób:
Zagnieżdżone typy klasy mogą być publiczne, chronione, wewnętrzne, chronione wewnętrzne, prywatne lub prywatne.
Jednak zdefiniowanie klasy lub
private protected
zagnieżdżonejprotected
protected internal
wewnątrz zapieczętowanej klasy generuje ostrzeżenie kompilatora CS0628 "nowy chroniony element członkowski zadeklarowany w klasie zapieczętowanej".Należy również pamiętać, że zewnętrzne uwidocznienie zagnieżdżonego typu narusza regułę jakości kodu CA1034 "Zagnieżdżone typy nie powinny być widoczne".
Zagnieżdżone typy struktury mogą być publiczne, wewnętrzne lub prywatne.
W poniższym przykładzie klasa jest publiczna Nested
:
public class Container
{
public class Nested
{
Nested() { }
}
}
Typ zagnieżdżony lub wewnętrzny może uzyskać dostęp do typu zawierającego lub zewnętrznego. Aby uzyskać dostęp do typu zawierającego, przekaż go jako argument do konstruktora typu zagnieżdżonego. Na przykład:
public class Container
{
public class Nested
{
private Container? parent;
public Nested()
{
}
public Nested(Container parent)
{
this.parent = parent;
}
}
}
Typ zagnieżdżony ma dostęp do wszystkich elementów członkowskich, które są dostępne dla jego typu zawierającego. Może ona uzyskiwać dostęp do prywatnych i chronionych elementów członkowskich typu zawierającego, w tym do wszystkich dziedziczynych chronionych elementów członkowskich.
W poprzedniej deklaracji pełna nazwa klasy Nested
to Container.Nested
. Jest to nazwa użyta do utworzenia nowego wystąpienia zagnieżdżonej klasy w następujący sposób:
Container.Nested nest = new Container.Nested();