Скачиваний:
1
Добавлен:
04.09.2023
Размер:
1.17 Mб
Скачать

18 Понятие класса. Определение класса и экземпляр класса. Данные и методы. Ключевое слово partial.

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

Данные, содержащиеся в классе, могут быть переменными или константами. Переменные и константы, описанные в классе, называются полями класса. При описании полей (на самом деле не только полей, но методов и даже самого класса) можно указывать атрибуты и спецификаторы/модификаторы, задающие различные характеристики элементов. Пример переменной: public int age; Пример константы: public const double Pi = 3.14159; public – это модификатор, делающий поле доступным вне класса.

Метод – функциональный элемент класса, реализующий вычисления или другие действия. Методы определяют поведение класса и составляют его интерфейс. К методу можно обратиться по имени. Он описывается один раз, а вызываться может столько раз, сколько необходимо. Один и тот же метод может обрабатывать различные данные, переданные ему в качестве аргументов.

Создание любого метода следует начинать с его интерфейса (заголовка). Необходимо четко представлять себе, какие параметры метод должен получать и какие результаты формировать. Входные параметры обычно перечисляют в начале списка параметров.

Тип возвращаемого значения _ название метода(входные аргументы)

int Square(int i)

{

int input = i;

return input * input;

}

Если функция ничего не возвращает, то вначале пишется void Square(int i) вместо int. Кроме того, вначале может стоять какой-либо модификатор, например, тот же public или protected, или public virtual / public abstract int Square(int i).

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

Для разделения определения класса используется ключевое слово partial. Ключевое слово partial указывает, что другие части класса могут быть определены в общем пространстве имен. Т.е. грубо говоря под общим пространством имен, подразумевается, что другие части класса описаны внутри одного проекта, может в разных файлах, может в разных частях одного файла. Все части должны использовать ключевое слово partial. Для формирования окончательного типа все части должны быть доступны во время компиляции. Все части должны иметь одинаковые модификаторы доступа, например public, private и т. д.

Любые члены класса, объявленные в разделяемом объявлении, доступны для всех остальных частей. Модификатор partial нельзя использовать для перечисления. Если какая-то часть (partial) класса является abstract, то весь класс будет abstract и так по аналогии с другим модификаторами, вроде, sealed. Кроме того, если какая-то часть наследует базовый класс, остальные тоже это делают.

Дополнительно

Помимо модификаторов доступа есть еще целая куча прочих модификаторов: abstract, async, const, event, extern, in, new, out, override, readonly, sealed, static, unsafe, virtual, volatile.

Например, статичная переменная static принадлежит классу, а не экземпляру, это значит, если в одном из экземпляров произойдет переопределение static переменной – она изменится сразу во всех экземплярах. К тому же ссылаться на static можно только через имя класса. Или вот, Abstract - класс, предназначенный только для использования в качестве базового класса для других классов и не существующий сам по себе.

Атрибуты представляют специальные инструменты, которые позволяют встраивать в сборку дополнительные метаданные. Атрибуты могут применяться как ко всему типу (классу, интерфейсу и т.д.), так и к отдельным его частям (методу, свойству и т.д.). Пример применения атрибута: проверяем соответствие возраста (переменной Age) заданному значению (18 лет) в нашем классе Person. Создаем атрибут, пишем его наименование непосредственно над классом в квадратных скобках и указываем пороговую величину возраста: [AgeValidation(18)], создаем функцию, которая получит класса все заданные для класса атрибуты, выберет первый атрибут, сверит данные и вернет true или false, затем прейдет к следующему атрибуту, если он есть.