Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSBasicCourse2ndedPodbelsky / CSBasicCourse2ndedPodbelsky.rtf
Скачиваний:
27
Добавлен:
22.03.2016
Размер:
11.9 Mб
Скачать

13.2. Вложение классов

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

Таким типом может быть класс. Этот внутренний класс называют вложенным

классом

"класс: вложение классов" , а включающий его класс – внешним.

Особенностью вложенного класса является то, что ему доступны все члены

внешнего класса, даже если эти члены закрытые (private). Обычно вложенный

класс вводится только для выполнения действий внутри внешнего класса и "не

виден" вне включающего его класса. Однако, вложенный класс может быть

объявлен с модификатором public и тогда он становится доступен везде, где виден

внешний класс. Если открытый класс Nested вложен в класс Outside, то дл

я

внешнего

обращения

к

вложенному

классу

следует

использовать

квалифицированное имя Outside.Nested.

Продемонстрируем

синтаксис

вложения

классов

на

примере

класса

окружность (Circle), центр которой представляет объект вложенного класса Point.

Чтобы возможности внешнего класса Circle были близки к возможностям уже

рассмотренных

классов,

реализующих

композицию

и

агрегацию,

сделаем

вложенный класс Point открытым. В следующей программе объявлен указанный

класс Circle с вложенным классом Point.

// 13_03.cs - вложение классов

using System;

class Circle

{ // Закрытые поля:

double rad; // радиус окружности

Point centre = new Point(); // центр окружности

// свойство для радиуса окружности:

public double Rad { get { return rad; }

set { rad = value; } }

// свойство для значения длины окружности:

public double Len { get { return 2 * rad * Math.PI; } }

// свойство для центра окружности:

public Point Centre { get { return centre; }

set { centre = value; } }

public void display()

{

Console.WriteLine("Centre: X={0}, Y={1}; " +

"Radius={2}, Length={3,6:f2}",

centre.X, centre.Y, this.rad, Len);

}

public class Point

{

double x, y;

public double X { get { return x; } set { x = value; } }

public double Y { get { return y; } set { y = value; } }

} // end of Point

} // end of Circle

class Program

{

static void Main()

{

Circle rim = new Circle();

rim.Centre.X = 100

;

rim.Centre.Y = 200;

rim.Rad = 30.0;

rim.display();

}

}

Результат выполнения программы:

Centre: X=100, Y=200; Radius=30, Length=188,50

В классе Circle для инициализации поля center используется конструктор

умолчания класса Point. Префикс "Circle." при этом не требуется применять, хотя

его использование не приведёт к ошибке. То же самое относится и к обозначению

типа свойства Centre. Нет явного определения конструкторов и во внешнем классе.

Поэтому в методе Main( ) для создания объекта, ассоциированного со ссылкой rim,

используется конструктор умолчания Circle( ). Для обращения к свойствам,

определяющим центр окружности, потребовалось использовать имена с двойной

квалификацией: rim.Centre.X и rim.Centre.Y.

В отличие от композиции и агрегации при вложении классов внутренний класс

"класс: внутренний класс"

(не только объект) не существует независимо от

внешнего. На диаграмме классов вложенный класс изображается именно внутри

внешнего (см. рис.13.3).

Рис. 13.3. Диаграмма вложения классов

Соседние файлы в папке CSBasicCourse2ndedPodbelsky