- •Теоретические основы объектно-ориентированного программирования
- •Объектная декомпозиция
- •Диаграмма обслуживания автомашин на бензоколонке
- •Диаграмма объектов имитационной модели бензоколонки
- •Объектная декомпозиция Блока колонок: 1 - когда освободится колонка? 3 - колонка свободна? 2 - освободить колонку 4 - занять колонку
- •Диаграмма объектов графического редактора
- •Диаграмма состояний интерфейса пользователя программы «Записная книжка»
- •Диаграмма объектов предметной области программы «Записная книжка»
- •Обозначение ассоциации: а - с указанием имени ассоциации и ее направления; б - с указанием имен ролей; в - с указанием множественности
- •Контекстная диаграмма классов программы «Записная книжка»
- •Объекты и сообщения
- •Типы отношений между объектами
- •Соответствие объекта-абстракции классу и объектам-переменным
- •Основные средства разработки классов
- •Иерархии классов при различных видах наследования
- •Иерархия классов Окно и Окно_меняющее_цвет
- •Иерархия классов Окно и Окно_с_текстом
- •Иерархия классов при сложном полиморфизме
- •Необходимость позднего связывания
- •Реализация механизма позднего связывания
- •Необходимость явного указания типа объекта, адресуемого указателем родительского класса
- •Вид окна сообщения
- •Структура полей класса Сообщение
- •Дополнительные средства и приемы разработки классов
- •Организация стека вызовов
- •Определение класса
- •Организация списка объектов с использованием статических компонентов класса
- •Конструкторы и деструкторы
- •Наследование
- •Иерархия классов Целое число - Вещественное число
- •Диаграмма классов с наследованием от двух классов и объектным полем
- •Иерархия с многократным наследованием
- •Исключения
- •1. Динамическая проверка типа объекта:
- •2. Динамическое переопределение типа объекта:
- •3. Динамическое определение типа объекта:
-
Типы отношений между объектами
Виды операций над объектами и типы отношений между ними определяют особенности реализации объектов.
-
Классы
Реализация объектов, полученных в результате объектной декомпозиции, принципиально возможна на любом языке. Однако наличие специальных средств позволяет существенно упростить программирование, дополнительно обеспечивая программиста заготовками классов из библиотек и встроенными механизмами обеспечения требуемых свойств.
Классы. Для представления абстракций объектов используется специальный определяемый программистом тип данных - класс.
Класс - это структурный тип данных, который включает описание полей данных, а также процедур и функций, работающих с этими полями данных.
Применительно к классам такие процедуры и функции получили название методов.
Реализация объединения данных с определенными видами их обработки делает классы пригодными для описания состояния и поведения моделей реальных объектов. Совокупность полей класса определяется множеством аспектов состояния объекта с точки зрения решаемой задачи, а совокупность методов - множеством аспектов поведения объекта (рис. 14).
В программах используются переменные типа класса. Такие переменные принято называть объектами.
-
Соответствие объекта-абстракции классу и объектам-переменным
-
Описание класса (класс Окно). Пусть необходимо разработать класс, переменные которого используются для изображения на экране цветного прямоугольника заданного цвета и размера (6).
-
Вид и параметры окна на экране
Проектируемый класс должен содержать поля для сохранения параметров окна: xl, yl, х2, у2 - координаты верхнего левого и нижнего правого углов и Color - цвет. Пусть единственное сообщение, обрабатываемое объектом - сообщение «Нарисовать окно». Соответственно, класс должен содержать метод, реализующий процесс рисования окна Изобразить. Поля объекта можно инициализировать при создании переменной-объекта, передав ему сообщение инициализации, включающее значения полей. Следовательно, класс должен содержать метод инициализации Инициализировать.
Окончательно получаем класс, имеющий следующую структуру:
Класс Окно:
поля XI, Y1,X2, Y2, Color
метод Инициализироватъ(аХ1,аY1,aX2,aY2,aColor)
метод Изобразить
Конец описания.
Создавая объекты типа Окно, инициализируя их в соответствии с условием и посылая им сообщение «Нарисовать окно», получим разные окна на экране, причем параметры этих окон будут храниться в объектах.
Каждая переменная-объект включает набор полей, объявленных в классе. Совокупность значений, содержащихся в этих полях, моделирует конкретное состояние объекта предметной области. Изменение этих значений в процессе работы отражает изменение состояния моделируемого объекта.
Воздействие на объект выполняется посредством изменения его полей или вызова его методов. Доступ к полям и методам объекта осуществляется, за исключением специальных случаев, с указанием имени объекта (при этом используют составные имена):
<имя объекта>.<имя поля> или <имя объекта>.<имя методах
Все методы объекта обязательно имеют доступ ко всем полям своего объекта. В рассматриваемых далее языках программирования это достигается через неявную передачу в метод специального параметра - ссылки или адреса области данных конкретного объекта (ссылка Self- в Паскале и адрес this - в C++). Таким образом, уменьшается количество параметров, явно передаваемых в метод.
Ограничение доступа. Большинство версий объектно-ориентированных языков позволяет ограничить доступ к некоторым полям и методам объекта, обеспечивающим функционирование «внутренностей» объекта. При наличии таких возможностей специальными средствами выделяют интерфейс и реализацию класса. Описание класса без учета синтаксиса конкретного языка выглядит следующим образом:
Класс <имя класса>
интерфейс
<объявление полей и методов класса, к которым возможно обращение извне>
реализация
<о6ъявление полей и методов класса, к которым невозможно обращение извне>
Конец описания.
Как уже говорилось выше, объединение полей данных и процедур и функций, работающих с этими данными, в единый пакет при наличии специальных правил доступа к элементам пакета называется инкапсуляцией.
Наличие интерфейса обеспечивает уменьшение возможности «разрушения» (несанкционированного изменения значений полей) объекта извне. Сокрытие особенностей реализации, кроме того, упрощает внесение изменений в реализацию класса как в процессе отладки, так и при модификации программы. Таким образом, класс определяет существование глобальной области данных внутри объекта, доступной методам объекта. С другой стороны, доступ к объекту регламентируется и должен выполняться через специальный интерфейс (7).
-
И нтерфейс и реализация класса
Как и любая другая переменная программы, объект должен быть размещен в памяти (создан) и удален из памяти (уничтожен). Причем создание и уничтожение объектов выполняется статически или динамически.
Статическое создание объектов выполняется в процессе компиляции программы, а статическое уничтожение - при завершении программы: объект удаляется из памяти вместе с программой.
Динамическое создание и уничтожение объектов выполняется в процессе работы программы специальными командами.
Операция создания и инициализация полей объекта получила название конструирования объекта, а операция уничтожения объекта - деструкции объекта. Соответствующие методы, если они определены в классе, получили название конструкторов и деструкторов. Конкретные особенности этих методов в различных языках программирования будут обсуждаться в соответствующих разделах.
-
Сокрытие реализации класса (класс Файл — продолжение примера 4). В соответствии с результатами объектной декомпозиции (рис. 5) объект Файл должен реагировать на сообщения: «Открыть», «Добавить запись», «Найти запись».
Каждое сообщение должно дополняться необходимой информацией. Так, сообщение «Открыть» должно сопровождаться передачей имени файла.
Сообщение «Добавить запись» должно сопровождаться передачей текста записи, состоящей из двух частей: фамилии абонента или названия организации и телефона. Сообщение «Найти запись» должно сопровождаться передачей фамилии и/или имени абонента или названия организации, по которым должен быть найден телефон.
Каждому сообщению должен соответствовать метод, объявленный в интерфейсной части класса и реализующий требуемые действия.
Метод Открыть должен выполнить открытие указанного файла для выполнения операций ввода-вывода. Операция открытия файла требует указания файловой переменной. Поскольку при выполнении операций с открытым файлом в дальнейшем должна будет использоваться та же файловая переменная, целесообразно описать ее в секции реализации класса, где она будет доступна методам данного объекта, но не доступна из других объектов программы.
Метод Добавить должен проверять наличие открытого файла и сообщать пользователю о невозможности выполнения операции с закрытым файлом. Если же файл открыт, метод должен осуществить добавление записей в файл. Для выполнения проверки необходимо хранить информацию об открытии файла, для этого можно использовать специальное поле Состояние_файла, которое также можно объявить в секции реализации.
Метод Найти также вначале должен проверять, открыт ли файл. Если файл открыт, метод выполняет поиск информации в файле.
Операции проверки открытия файла выполняются в методах Добавить и Найти идентично, их можно выделить в отдельный метод Проверка_открытия, который можно описать в секции реализации.
Для инициализации поля Состояние_файла (в исходном состоянии файл закрыт) можно использовать специальный метод, традиционно с этой целью используется конструктор. При завершении программы файл необходимо закрыть. Операция закрытия может быть описана в деструкторе.
Окончательно для реализации объекта Файл можно предложить класс следующей структуры:
Класс Файл:
интерфейс
конструктор Инициализировать;
метод Открыть (имя файла);
метод Добавить (фамилия, телефон);
метод Найти (фамилия);
деструктор Закрыть_файл;
реализация
поле файловая _переменная;
поле Состояние_файла;
метод Проверка_открытия;
Конец описания.
После определения структуры класса должны быть разработаны алгоритмы методов и назначены типы полей и передаваемых параметров.
В программе должна быть использована переменная типа Файл. Так как файл в программе используется постоянно, соответствующую переменную лучше определять статически.
Передача сообщений объекту будет реализована как вызов соответствующего метода интерфейсной части.