Класс в ООП соответствует определённому объекту предметной области. При работе с классами используются три основных принципа:
- инкапсуляция;
- полиморфизм;
- наследование.
Подробное рассмотрение этих принципов не является задачей данного пособия, поэтому они будут описаны в краткой форме.
Инкапсуляция означает объединение данных и кода, который их обрабатывает, в едином элементе программе – классе. Это позволяет обезопасить данные от внешнего вмешательства и неправильного их использования, а также скрыть подробности внутренней реализации класса. Программист – разработчик класса обычно стремится скрыть данные от внешней программы и реализовать для их обработки собственные функции.
Например, может быть разработан класс для представления даты. Дата хранится внутри класса в виде трех чисел – дня, месяца и года. Непосредственный доступ к этим числам закрыт, а для их получения и изменения разработаны соответствующие функции класса. Функции изменения даты проверяют допустимость её нового значения: месяц должен быть в диапазоне от 1 до 12, день – от 1 до 28-31 в зависимости от месяца и года. Год также может иметь диапазон допустимых значений.
В классе даты также могут быть функции увеличения и уменьшения её значения на указанное количество дней, вычитания двух дат для получения временного интервала, проверки года на високосность и т.д.
В результате получается самодостаточный класс даты, который можно легко использовать в программах не зная ничего о его внутреннем устройстве и не заботясь о собственных алгоритмах работы с датами. В этом смысле класс можно считать «чёрным ящиком».
Полиморфизм – это свойство, позволяющее использовать одно имя для обозначения множества схожих, но в чём-то отличающихся действий. Говоря другими словами: один интерфейс – множество реализаций. Одним из примеров полиморфизма является перегрузка функций, при которой несколько функций имеют одно имя, но различаются типом и/или количеством аргументов. Выбор конкретной функции при использовании общего имени выполнит компилятор при сборке программы.
Таким образом, полиморфизм позволяет упростить разработку программ за счет введения одного имени для задания общего класса действий.
Например, пусть существует класс геометрических фигур. Он может быть использован для описания треугольника, прямоугольника, ромба, эллипса и т.д. Класс реализует функции для перемещения, поворота и масштабирования фигур. Полиморфизм позволяет использовать для этих действий одно имя для всех типов фигур. Например, функция поворота будет называться rotate. Это одно имя будет иметь различные реализации для разных типов фигур. Функции масштабирования также будет отличаться в зависимости от фигуры, для которой они выполняются. Но все эти функции будут иметь одно имя, например, scale.
Другой пример полиморфизма – класс матрицы. В программе могут быть описаны несколько классов матриц, отличающиеся типами элементов. Например, матрица целых чисел, матрица символов и матрица строк. Все они будут иметь функции возвращения подматрицы. И эти функции будут иметь одно имя – submatrix – несмотря на то, что каждый класс матрицы будет иметь собственную реализацию этой функции.
Наследование позволяет одному классу приобретать свойства другого. При этом новый класс (производный, наследник) порождается на основе уже существующего класса (базовый, родитель). Новый класс наследует от базового класса все его свойства и добавляет при этом новые, характерные только для него. Также наследник может переопределять унаследованные от родителя свойства.
Наследование позволяет поддерживать концепцию иерархии классов, когда создается нисходящее дерево классов, описывающее предметную область.
Например, существует класс «Автомобиль». У него может быть следующий перечень свойств: «Масса», «Количество пассажирских мест», «Объём бака», «Мощность двигателя», «Количество колес».
В качестве его наследников создаются классы «Автобус», «Грузовик», «Легковой автомобиль». Они наследуют все свойства родителя.
Класс «Автобус» дополнительно определяет свойства «Количество сидячих мест», «Количество стоячих мест», «Количество дверей для посадки пассажиров», «Тип автобуса».
Класс «Грузовик» задает собственные свойства «Объем платформы», «Тип грузовика».
Класс «Легковой автомобиль» добавляет к свойствам родителя «Тип кузова», «Количество дверей», «Объём багажника».
На основе класса легковой автомобиль могут быть созданы производные классы, описывающие конкретные марки машин. Например, его наследниками будут классы «ВАЗ 2101», «ВАЗ 2110», «Ford Focus», «Toyota Camry» и т.д.
В результате получается следующая иерархия классов: