Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

10.3.8Вложенные типы

Тип, объявленный в рамках объявления класса или структуры, называется вложенным типом. Тип, объявленный в рамках единицы компиляции или пространства имен, называется невложенным типом.

Пример.

using System;

class A { class B { static void F() { Console.WriteLine("A.B.F"); } } }

В этом примере класс B является вложенным типом, так как он объявлен в рамках класса A, а класс A является невложенным типом, так как он объявлен в рамках единицы компиляции.

10.3.8.1Полные имена

Полным именем (§3.8.1) для вложенного типа является S.N, где S является полным именем типа, в котором объявлен тип N.

10.3.8.2Объявленная доступность

Невложенные типы могут иметь объявленную доступность public или internal, а по умолчанию – internal. Вложенные типы тоже могут иметь эти виды объявленной доступности, плюс один или более видов объявленной доступности, в зависимости от того, является ли тип-контейнер классом или структурой.

  • вложенный тип, объявленный в классе, может иметь любой из пяти видов объявленной доступности (public, protected internal, protected, internal или private) и, подобно другим членам класса, по умолчанию – private;

  • Вложенный тип, объявленный в структуре, может иметь любой из трех видов объявленной доступности (public, internal или private) и, подобно другим членам структуры, по умолчанию – private.

Пример.

public class List { // Private data structure private class Node { public object Data; public Node Next;

public Node(object data, Node next) { this.Data = data; this.Next = next; } }

private Node first = null; private Node last = null;

// Public interface

public void AddToFront(object o) {...}

public void AddToBack(object o) {...}

public object RemoveFromFront() {...}

public object RemoveFromBack() {...}

public int Count { get {...} } }

В этом примере объявляется частный вложенный класс Node.

10.3.8.3Скрытие

Вложенный тип может скрывать (§3.7.1) базовый член. В объявлениях вложенных типов разрешен модификатор new, так что скрытие можно выразить явно. Пример.

using System;

class Base { public static void M() { Console.WriteLine("Base.M"); } }

class Derived: Base { new public class M { public static void F() { Console.WriteLine("Derived.M.F"); } } }

class Test { static void Main() { Derived.M.F(); } }

показан вложенный класс M, скрывающий метод M, определенный в Base.

10.3.8.4Доступ this

Вложенный тип и его тип-контейнер не имеют особого отношения к доступу_this (§7.6.7). В частности, this внутри вложенного типа нельзя использовать для ссылки на члены экземпляра типа-контейнера. В случае, если вложенному типу требуется доступ к членам экземпляра типа-контейнера, доступ может быть выполнен предоставлением this для экземпляра типа-контейнера в качестве аргумента конструктора для вложенного типа. Пример.

using System;

class C { int i = 123;

public void F() { Nested n = new Nested(this); n.G(); }

public class Nested { C this_c;

public Nested(C c) { this_c = c; }

public void G() { Console.WriteLine(this_c.i); } } }

class Test { static void Main() { C c = new C(); c.F(); } }

В этом примере показан этот способ. Экземпляр C создает экземпляр Nested и передает свой собственный this конструктору Nested, чтобы предоставить последовательный доступ к членам экземпляра C.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]