Понятия объектно-ориентированного программирования

advertisement
Понятия объектно-ориентированного программирования
1. Объекты
Для примера возьмём программу, играющую в шашки. Изображения доски и шашек, текущая
позиция на доске, информация о том, чей сейчас ход - это данные. А алгоритм игры в шашки - это код.
В модульном программировании данные и код чётко разделены. Например, в программах на Turbo
Pascal вы отдельно описываете типы данных и переменные (в разделах type и var), отдельно
описываете процедуры, функции и тело программы.
В жизни любой объект может быть описан набором свойств, которыми он обладает, и действий
(методов), которые можно с ним выполнить (проще говоря, какой он из себя и что с ним можно
делать). Для того, чтобы описать объект, нужно перечислить и свойства, и действия, только тогда
описание будет полным.
Такой принцип «объединения» в одно целое свойств и методов получил название инкапсуляции.
Инкапсуляция - принцип, заключающийся в том, что каждый объект содержит как набор свойств,
так и набор действий (методов), которые с ним можно выполнить.
Другими словами, данные и код объединяются в единую «капсулу», которая и называется
объектом.
Нам доступен только некоторый набор методов и свойств, с помощью которых можно оперировать
с объектом. Например, для того, чтобы управлять автомобилем, можно не знать его устройство, принцип работы двигателя, а достаточно научиться им управлять с помощью внешних элементов (руль,
педали, приборная доска). Иначе говоря, все свойства и методы делятся на внутренние и внешние.
Внутренние - определяют его поведение и возможности. Внешние - служат для управления объектом.
Совокупность внешних методов и свойств объекта, доступных для управления, называется
интерфейсом объекта. Т.е. внешние элементы автомобиля - это его интерфейс.
Многие люди пользуются компьютером, не зная, как он устроен. Это опять же достигается за счёт
упрятывания подробностей внутреннего устройства и удобного интерфейса пользователя.
Можно сказать и так: интерфейс - это «рычаги управления» объектом, а реализация - это
«шестерёнки» внутри него.
Для примера в качестве объекта возьмём обычный стул (рис. 5.1), стоящий в комнате. Назовём
его Стул1. Он также обладает определёнными свойствами и методами:
свойства
Цена (руб.)
Цвет
Материал
Ножек
Форма
Вес (кг)
Координаты,см
{месторасположе
ние стула в
комнате)
методы
Сесть
Прогнётся
на
5 см
Красный
Купить
В магазине
«Уют»
Дерево
Продать
На базаре
«Привоз»
4
Передвину С помощью
внешней
Классическ ть
механичеая
ской силы
2
[100, 200]
900
Для полноценности объекта эти свойства и методы должны быть обязательно заполнены
.
В комнате, кроме объекта Стул1, могут находиться и другие стулья (например, Стул2, СтулЗ и т.д.).
И каждый из них обладает определёнными свойствами и методами, пусть даже и одинаковыми.
Теперь предположим, что нам необходимо передвинуть объект Стул1 в позицию с новыми
координатам [300, 300] либо перекрасить его в зелёный цвет.
Для этого нужно указать имя объекта и через точку записать то свойство, которое будем изменять.
После чего присвоить ему новое значение. Например, чтобы изменить цвет стула с красного на
зелёный, необходимо записать:
Стул1.Цвет := Зелёный;
Чтобы выполнить над стулом какие-то действия, достаточно просто вызвать его метод, например:
Стул1.Продать;
Причём его продажа будет по той цене, которая указана в свойстве «Цена».
Часто бывает, что сложный объект состоит из более мелких объектов. Они отвечают за отдельные его
части. В нашем случае достаточно сложный объект Стул1 состоит из спинки, сиденья, ножки 1,
ножки 2, ножки 3 и ножки 4 (рис. 5.1).
Если мы хотим изменить свойство отдельных частей объекта, то необходимо указать «полный путь».
Например, чтобы изменить цвет третьей ножки стула объекта Стул1 на жёлтый, необходимо
записать:
Стул1.НожкаЗ.Цвет := Жёлтый;
2. Классы
Каждый объект обладает набором методов и свойств. Объекты, имеющие одинаковый набор, можно
сгруппировать в классы. Можно дать несколько определений класса.
Класс - это категория объектов, обладающих одинаковыми свойствами и поведением. Класс - это
шаблон, описывающий объекты.
Таким образом, наш объект Стул1 можно отнести к общему классу «Стул». В свою очередь класс
«Стул» можно отнести к более общему классу «Мебель». Этот класс обладает общим набором
свойств и методов (цвет, материал, положение, купить, продать и пр.). При этом значения некоторых
методов или свойств могут отличаться: у разных объектов-стульев может быть разный цвет и цена,
их можно купить в различных магазинах.
Примечание. Не стоит думать, что класс - это набор всех стульев в комнате. Стулья, расположенные в
комнате, можно назвать массивом либо коллекцией. Класс лишь «чертеж» объекта, т.е. объект Стул1 без
заполнения свойств конкретными значениями является классом.
Другими словами, понятие «класс» можно сопоставить с описанием предмета реального мира, а
«объект» - с самим предметом. Когда в разговорной речи мы произносим слово «арбуз», то
подразумеваем: полосатый, круглый, съедобный, сочный, большой и пр. - некий шаблон, заготовку,
описывающую арбузы вообще. Если берём в руки реальный арбуз, то имеем дело с конкретным
объектом этого класса, который может оказаться продолговатым, незрелым, маленьким и пр.
Для того чтобы можно было использовать объекты, сначала должен быть создан класс. Иначе говоря,
должен быть описан тип данных, в котором указано, какими свойствами будут обладать входящие в
него объекты. Затем необходимо написать реализацию всех методов в виде программного кода. В
объектно-ориентированном программировании принято перед именем класса ставить букву Т.
Например, класс «Стул» запишется как «ТСтул». Это используется для того, чтобы не было
путаницы в описании типов.
После того, как класс описан, можно создавать экземпляры данного класса.
Экземпляр класса - конкретный объект данного класса (например стул)
5.3. Наследование
Часто возникает ситуация, когда уже имеющийся в наличии класс близок к описанию требуемых нам
объектов, но, тем не менее, не совсем подходит для наших целей.
Например: разработан класс Стул (рис. 5.1), но для работы необходим объект Скамейка1.
Первая идея, которая приходит в голову начинающим программистам: сделать копию
существующего класса и внести в нее необходимые изменения (переименовать и, если требуется,
дополнить свойства, методы). В результате получается громоздкая программа, в которой одни и те
же инструкции написаны по нескольку раз.
Объектно-ориентированное программирование предлагает более удобный принцип, называемый
наследованием.
Наследование - принцип, заключающийся в том, что новый класс может быть построен на базе уже
существующего класса. При этом он наследует все характеристики своего класса-родителя, а
описаны должны быть только новые или изменённые свойства и методы.
Таким образом, никакого дублирования не происходит: описываются только различия классов.
Класс, от которого происходит наследование, называется суперклассом или классом-родителем, а
наследуемый класс называется подклассом или классом-наследником. Новый класс тоже может иметь
наследников и так далее. Т.е., один класс может наследоваться от другого не напрямую, а через
несколько «поколений», которые обычно называются уровнями. В этом случае говорят о косвенном
наследовании.
Потомок класса - класс, наследуемый от данного. Предок класса - класс, от которого прямо или
косвенно наследуется данный класс.
В любом объектно-ориентированном языке программирования существует класс верхнего уровня, а
все остальные классы являются его потомками.
Например, для класса «ТСтул» классом верхнего уровня можно считать класс «ТМебель» (рис. 5.2).
От этого верхнего уровня можно создать множество других классов, которые также являются
элементами мебели, например «ТШкаф».
Для создания класса «ТСкамейка» можно воспользоваться уже готовым классом «ТСтул», просто
добавив к нему свойство «Мест», определяющее количество сидячих мест.
5.4. Полиморфизм
Как уже говорилось, наследуемый класс получает все характеристики класса-родителя. При этом он
может иметь свои собственные характеристики. Однако иногда подкласс должен не добавить что-то
к существующему классу, а переопределить.
Например, класс «Дамка» наследуется от класса «Шашка». При этом он наследует все его методы, в
том числе методы «сходить» и «срубить шашку соперника». Однако у «дамки» эти методы должны
отличаться, ведь она может ходить в гораздо более широких пределах. Таким образом, методы
«сходить» и «срубить» должны быть переопределены.
Переопределение метода - создание метода с тем же именем, что и у класса-родителя, но
реализованного другим образом.
Возможность переопределения методов в классах-потомках и называется полиморфизмом. Слово
полиморфизм, образованное от греческих poly (много) и morphos (форма), означает множественность
форм.
Принцип полиморфизма заключается в том, что в классе-наследнике могут быть переопределённые
методы класса-родителя.
Иначе говоря, в классе-наследнике может быть метод с таким же именем, что и у родителя, но
работающий совсем по-другому.
Например, в мультимедийной программе необходимо работать с файлами разных типов:
графическими, звуковыми, видео. Для каждого из них может быть определён метод «открыть», но у
всех он будет реализован по-разному.
Однако полиморфизм не ограничивается только переопределением методов. Главная прелесть
полиморфизма состоит в том, что объекты класса-потомка могут заменять объекты класса-предка.
Это можно проиллюстрировать таким примером. Допустим, есть класс «Человек», который
описывает общие свойства всех людей. От него можно произвести такие подклассы, как «Студент»,
«Инженер», «Школьник», «Учёный», «Военный», «Пенсионер» и т.д. На стуле может сидеть любой
человек (т.е. экземпляр класса «Человек»). Это означает, что можно посадить на него и студента, и
инженера, и школьника, и экземпляры других подклассов.
Без полиморфизма пришлось бы использовать оператор выбора (в языке Паскаль - оператор case),
где перечислялись бы все возможные виды классов и способы их использования. Причём при
добавлении нового класса в Case добавлялись бы новые варианты.
Использование же полиморфизма позволяет записать исходный код в более логичном виде и
упрощает расширяемость (часто говорят масштабируемость) программы.
Download