Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по ая.docx
Скачиваний:
22
Добавлен:
20.09.2019
Размер:
276.66 Кб
Скачать

Изображение интерфейсов и абстрактных классов на диаграмме классов

Для обозначения имени абстрактного класса используется наклонный шрифт (курсив). В языке UML принято общее соглашение о том, что любой текст, относящийся к абстрактному элементу, записывается курсивом. Это имеет принципиальное значение, поскольку является семантическим аспектом описания абстрактных элементов языка UML.

Интерфейс (interface) в UML фактически является описанием (без реализации) группы функций, которые он предоставляет для использования другому классу. Логика работы этих функций не определяется. Имеется лишь возможность задать неформальное (например, на естественном языке) описание того, что от них требуется.

Класс поддерживает (или реализует) интерфейс, если он содержит методы, реализующие все операции интерфейса. Между двумя интерфейсами можно задать отношение наследования. Оно будет означать обычное теоретико-множественное объединение списков операций предка и потомка.

На диаграмме классов UML интерфейс можно изобразить двумя способами: развернутым и сокращенным. В случае развернутого способа интерфейс изображается на диаграмме как класс со стереотипом "interface" и без секции атрибутов . Допустимо также сокращенное изображение интерфейса - небольшой кружок с именем интерфейса возле него.

Во второй нотации интерфейсы представлены в виде кругов с линиями, соединяющими их с реализующими классами. Эта нотация более компактна и упрощает диаграмму, но при этом исчезают некоторые детали описания.

Вложенные классы

Иногда некоторый класс играет чисто вспомогательную роль для другого класса и используется только внутри него. В этом случае логично описать его внутри существующего класса. Когда класс объявлен внутри другого класса, он называется вложенным (nested) внутрь другого класса.

class Container

{

class Nested

{

}

}

Чтобы создать экземпляр вложенного класса, укажите имя класса контейнера и имя вложенного класса, используя в качестве разделителя точку:

Container.Nested nestedInstance = new Container.Nested()

Вложенные классы могут получать доступ к закрытым и защищенным членам содержащего класса, включая любые наследуемые закрытые или защищенные члены.

Статические классы

Статический класс в основном такой же, что и нестатический класс, но имеется одно отличие: нельзя создавать экземпляры статического класса. Другими словами, нельзя использовать ключевое слово new для создания переменной типа класса. Поскольку нет переменной экземпляра, доступ к членам статического класса осуществляется с использованием самого имени класса.

Статический класс может использоваться как обычный контейнер для наборов методов, работающих на входных параметрах, и не должен возвращать или устанавливать каких-либо внутренних полей экземпляра. Например, в библиотеке классов платформы .NET Framework статический класс System.Math содержит методы, выполняющие математические операции, без требования сохранять или извлекать данные, уникальные для конкретного экземпляра класса Math. Это значит, что члены класса применяются путем задания имени класса и имени метода.

По сути, создания статического класса аналогично созданию класса, содержащего только статические члены и закрытый конструктор. Закрытый конструктор не допускает создания экземпляров класса. Преимущество применения статических классов заключается в том, что компилятор может проверить отсутствие случайно добавленных членов экземпляров. Таким образом, компилятор гарантирует невозможность создания экземпляров таких классов.

Статические классы запечатаны, поэтому их нельзя наследовать. Они не могут быть унаследованы ни от каких классов, кроме Object. Статические классы не могут содержать конструктор экземпляров, но могут содержать статический конструктор. Нестатические классы также должен определять статический конструктор, если класс содержит статические члены, для которых нужна нетривиальная инициализация

class InstCount

{

static public int instanceCount;

public InstCount()

{

instanceCount++;

}

}

public static unsafe void Main()

{

Console.WriteLine(InstCount.instanceCount);

InstCount icl = new InstCount();

Console.WriteLine(InstCount.instanceCount);

InstCount ic2 = new InstCount();

Console.WriteLine(InstCount.instanceCount);

Console.ReadLine();

}