
Глава 1. Объектная ориентация программ на с# 1.1. Типы, классы, объекты
Язык С# - объектно-ориентированный язык со строгой типизацией.
В объектно-ориентированных языках все является объектом – от констант и переменных базовых типов до данных агрегированных типов любой сложности...
Но что такое тип? Тип в программировании понятие первичное. Тип не определяют через более простые понятия.
Тип некоторой сущности декларирует для нее совокупность возможных состояний и набор допустимых действий. Понятие сущности, мы пока не уточняем, сущностями могут быть константы, переменные, массивы, структуры и т.д.
Наиболее часто понятие тип в языках программирования используют в связи с понятием "переменная".
Примитивное (но пока достаточное для наших целей) определение: переменная это пара "обозначение переменной + значение переменной".
Для переменной тип вводит совокупность ее возможных значений и набор допустимых операций над этими значениями.
Пример определения переменной в Си, Си++, С# и некоторых других языках:
int spot=16;
spot - обозначение (имя) переменной, 16 - ее значение в данный момент (после этого определения), int - название типа переменной. Этот тип int определяет для переменной spot предельные значения, совокупность допустимых значений и набор операций с правилами их выполнения. Например, для spot определена операция получения остатка от деления (%) и особым образом определено деление на целую величину (/ в этом случае обозначает операцию целочисленного деления). Результат spot/5 равен 3, а значением выражения spot%3 будет 1.
Типы в языке С# введены с помощью классов (а также структур, перечислений, интерфейсов, делегатов и массивов). Но обо всём по порядку.
Понятие класса в теоретических работах, посвященных объектно-ориентированной методологии, обычно вводится на основе понятия "объект". Объект определяют по-разному.
Приведем примеры определений (см., например, [3]).
"Объектом называется совокупность данных (полей), определяющих состояние объекта, и набор функций (методов), обеспечивающих изменение указанных данных (состояния объекта) и доступ к ним".
"Объект - инкапсуляция множества операций (методов), доступных для внешних вызовов, и состояния, запоминающего результаты выполнения указанных операций"
После подобного определения в пособиях по объектно-ориентированному программированию перечисляются обязательные признаки объектов:
различимость;
возможность одного объекта находиться в разных состояниях (в разное время);
возможность динамического создания объектов;
4. "умение" объектов взаимодействовать друг с другом с помощью обменов сообщениями;
наличие методов, позволяющих объекту реагировать на сообщения (на внешние для объекта воздействия);
инкапсуляция данных внутри объектов.
Введя понятие объекта, класс определяют как механизм, задающий структуру (поля данных) всех однотипных объектов и функциональность объектов, то есть механизм, определяющий все методы, относящиеся к объектам.
В процессе развития объектно-ориентированного подхода и при его реализации в языках программирования стало ясно, что среди данных объекта могут существовать такие, которые принадлежат не единичному объекту, а всем объектам класса. То же было выявлено и для методов – некоторые из них могли определять не функциональность отдельного (каждого) объекта, а быть общими для класса (для всех его объектов). В совокупности поля и методы, как класса, так и формируемых с его помощью объектов называются членами класса.
Для иллюстрации этих понятий и особенно отличий полей и методов класса от полей и методов его объектов рассмотрим пример: Класс с названием "студент группы N-гo курса".
поля (данные) объекта: ФИО, оценки за сессию, взятые в библиотеке книги и т.д.
методы объекта: сдать экзамен, получить книги в библиотеке и т.д.
поля (данные) класса: номер курса (N), даты экзаменов, количество дисциплин в семестре и т.д.
метод класса: перевести группу на следующий курс - изменятся все данные класса, но не все объекты останутся в этом измененном классе (не обязательно все студенты будут переведены на следующий курс).
Различие между данными и методами объектов и данными и методами их класса существенно используется в языке С#. Чтобы их различать в определении (в объявлении) класса его данные и его методы снабжаются специальным модификатором static (статический). Примеры мы приведем позже...
Итак, класс играет две роли:
• класс это контейнер для методов класса и данных класса;
• класс это «трафарет», позволяющий создавать конкретные объекты.
Для каждого конкретного объекта, класс определяет структуру его состояния и поведение. Состояние объекта задается совокупностью значений его полей. Поведение объекта определяется набором методов, относящихся к объектам данного класса.
В соответствии с объектной ориентацией языка С# - всякая программа на языке С# представляет собой класс или совокупность классов.
Внутри объявления каждого класса могут быть размещены:
данные класса (статические поля);
методы класса (статические методы);
данные объектов класса (не статические поля);
методы для работы с объектами классов (не статические методы);
внутренние классы;
дополнительные члены, речь о которых еще впереди.