Типы отношений между объектами. Интерфейс и реализация класса. Наследование. Простой полиморфизм. Сложный полиморфизм. Композиция. Наполнение.

Под объектом применительно к ООП понимается отдельно реализуемая часть предметной области задачи. Разрабатываемая программа состоит из объектов, которые взаимодействуют через передачу сообщений. Каждый объект, получая сообщения должен определенным образом «реагировать» на них, выполняя заранее определенные для каждого типа сообщения действия.

Реакция объекта на сообщение может зависеть от его состояния, так объект Файл, получив сообщение «Добавить запись», прежде, чем добавлять запись, должен проверить, открыт ли соответствующий файл, и при закрытом файле должен выдать пользователю отказ на выполнение операции добавления.

Состояние объекта характеризуется набором конкретных значений некоторого перечня всех возможных свойств данного объекта.

Набор свойств, в процессе функционирования не изменяется, могут изменяться лишь конкретные значения этих свойств.

Поведение объектов характеризуется определенным набором реакций на получаемые сообщения и часто зависит от состояния объекта.

Объекты, обладающие сходными состояниями и поведением с точки зрения решаемой задачи, образуют группу. Свойства объекта, которые отличают его от всех других объектов группы, составляют его индивидуальность.

Если объект может обладать некоторым состоянием, то, соответственно, может возникнуть необходимость в получении информации об этом состоянии. Для получения такой информации объекту посылается сообщение-запрос.В ответ на запрос, объект должен переслать отправителю требуемую информацию. В таких случаях говорят, что над объектом выполнена операция селекции.

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

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

Соответственно, каждое сообщение, принимаемое объектом, может инициировать выполнение одной или нескольких операций указанных типов.

Полный список возможных операций над объектами:

1) создание объекта;

2) уничтожение объекта;

3) модификация - изменение состояния объекта;

4) селекция - доступ для определения состояния;

5) итерация - доступ к содержимому объекта по частям в определенной последовательности (используется при наличии в объекте некоторых однотипных компонент).

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

В случае, когда один объект передает сообщение другому, говорят, что эти объекты находятся в отношении использования , причем объект, инициирующий сообщение называется активным, а объект, получающий сообщение - пассивным.

Соответственно, отношение использования может принимать формувоздействия(активный объект воздействует на пассивный объект, передавая ему сообщение),исполнения(пассивный объект исполняет указание активного объекта) и посредничества (некоторый объект - посредник, получив сообщение от активного объекта, передает его пассивному объекту).

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

Классы

Для представления абстракций объектов используется специальный определяемый программистом тип данных - класс.

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

Рис. 3. Соответствие объекта-абстракции классу и объектам-переменным

В программах используются переменные типа класса. Такие переменные принято называть просто объектами.

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

Воздействие на объект выполняется посредством изменения его полей или вызова его методов. Доступ к полям и методам объекта осуществляется, за исключением специальных случаев, с указанием имени объекта (при этом используется составные имена):

<имя объекта>.<имя поля>или<имя объекта>.<имя метода>.

Все методы объекта обязательно имеют доступ ко всем полям своего объекта. Это достигается через неявную передачу в метод специального параметра - адреса области данных конкретного объекта (Self - в Паскале и this - в С++). Таким образом, уменьшается количество параметров, явно передаваемых в метод.

Большинство версий объектно-ориентированных языков позволяют ограничить доступ к некоторым полям и методам объекта, обеспечивающим функционирование «внутренностей» объекта. При наличии таких возможностей специальными средствами выделяют интерфейс и реализацию класса.

Описание класса без учета синтаксиса конкретного языка выглядит следующим образом:

Класс <имя класса>

Интерфейс

<объявление полей и методов класса, к которым возможно обращение извне>

Реализация

<объявление полей и методов класса, к которым невозможно обращение извне>

Конец описания.

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

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

Рис. 4. Интерфейс и реализация класса

Как и любая переменная программы, объект должен быть размещен в памяти (создан) и удален из памяти (уничтожен). Причем создание и уничтожение объектов может выполняться статически и динамически.

Статическоесоздание объектов выполняется в процессе компиляции программы, а статическое уничтожение - при завершении программы: объект удаляется из памяти вместе с программой. Динамическое создание и уничтожение объектов выполняется в процессе работы программы специальными командами.

Операция создания и инициализация полей объекта получила название конструирования объекта, а операция уничтожения объекта - деструкции объекта.Соответствующие методы, если они определены в классе, получили название, конструкторов и деструкторов.

Пример

Рис. 5. Диаграмма объектов системы «Записная книжка»

В соответствии с результатами объектной декомпозиции (рис. 5) Файл должен реагировать на следующие сообщения: «Открыть», «Добавить запись», «Найти запись».

Каждое сообщение должно дополняться необходимой информацией. Так, сообщение «Открыть» должно сопровождаться передачей имени файла. Сообщение «Добавить запись» должно сопровождаться передачей текста записи, состоящей из двух частей: фамилии абонента или названия организации и телефона. Сообщение «Найти запись» должно сопровождаться передачей фамилии абонента или названия организации, по которым должен быть найден телефон.

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

МетодОткрытьдолжен выполнить открытие указанного файла для выполнения операций ввода-вывода. Операция открытия файла требует указания файловой переменной. Поскольку при выполнении операций с этим файлом в дальнейшем должна будет использоваться та же файловая переменная, целесообразно описать ее в секции реализации класса, где она будет доступна методам данного объекта, но не доступна из других объектов программы.

Метод Добавить должен проверять наличие открытого файла и сообщать пользователю о невозможности выполнения операции с закрытым файлом. Если же файл открыт, метод должен выполнить добавление записей в файл. Для выполнения проверки необходимо хранить информацию об открытии файла, для этого можно использовать специальное поле Состояние_файла, которое также можно объявить в секции реализации.

Метод Найти также вначале должен проверять, открыт ли файл. Если файл открыт, метод выполняет поиск информации в файле. Операции проверки открытия файла выполняются в методах Добавить и Найти идентично, их можно выделить в отдельный метод Проверка_открытия, который можно описать в секции реализации.

Для инициализации поля Состояние_файла (в исходном состоянии - файл закрыт) можно использовать специальный метод, традиционно с этой целью используется конструктор. При завершении программы файл необходимо закрыть. Операция закрытия может быть описана в деструкторе.

Окончательно, для реализации объекта Файл можно предложить класс следующей структуры:

Класс Файл:

Интерфейс

конструктор Инициализировать;

методОткрыть (имя файла);

методДобавить(фамилия, телефон);

методНайти(фамилия);

деструкторЗакрыть_файл;

Реализация

полефайловая_переменная;

полеСостояние_файла;

методПроверка_открытия;

Конец описания.

После определения структуры класса должны быть разработаны алгоритмы методов и назначены типы полей и передаваемых параметров.

В программе должна быть использована переменная типа Файл. Так как файл в программе используется постоянно, соответствующую переменную лучше определять статически.

Передача сообщений объекту будет реализована как вызов соответствующего метода интерфейсной части.