Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

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

.pdf
Скачиваний:
169
Добавлен:
18.03.2015
Размер:
503.25 Кб
Скачать

Страница 21 из 51

Основные принципы ООП

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

Например, « Активизировать» для интерфейсного элемента, в зависимости от типа реализации (статической или динамической) может означать, либо создание объекта - при динамической реализации либо его модификацию - « видимый» вместо « невидимый» при статической реализации.

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

между объектами, которые бывают двух типов.

1. В случае, когда один объект передает сообщение другому, говорят, что эти объекты находятся в отношении использования (рис. 1.15), причем объект,

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

Соответственно, отношение использования может принимать форму

воздействия (активный объект воздействует на пассивный объект, передавая ему сообщение), исполнения (пассивный объект исполняет указание активного

Страница 22 из 51

Основные принципы ООП

объекта) и посредничества (некоторый объект - посредник, получив сообщение от активного объекта, передает его пассивному объекту).

2. Если объект является результатом декомпозиции более сложного объекта, то говорят, что между этими объектами существует отношение

включения - первый объект включает второй (иерархия целое/часть).

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

Классы

Реализация объектов, полученных в результате декомпозиции,

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

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

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

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

Применительно к классам такие процедуры и функции получили название

методов.

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

множеством аспектов поведения объекта (рис. ).

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

Страница 23 из 51

Основные принципы ООП

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

Проектируемый класс должен содержать поля для сохранения параметров окна: X1, Y1, Х2, Y2 - координаты верхнего левого и нижнего правого углов и

Color - цвет.

Пусть единственное сообщение,

обрабатываемое

объектом, -

« Нарисовать окно».

Соответственно,

класс должен содержать метод,

реализующий процесс

рисования объекта. Поля объекта можно

инициализировать

при

создании переменной-объекта,

передав ему

сообщение инициализации, включающее значения полей. Следовательно,

Страница 24 из 51

Основные принципы ООП

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

Класс Окно:

поляХ1,У1,Х2,У2, Color

метод Инициализировать(аХ1 ,aY1 ,aX2, aY2,aColor)

метод Изобразить Конец описания.

Создавая объекты типа Окно, инициализируя их в соответствии с условием и посылая им сообщение « Нарисовать окно», получим разные окна на экране,

причем параметры этих окон будут храниться в объектах.

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

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

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

или

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

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

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

уменьшается количество параметров, явно передаваемых в метод.

Страница 25 из 51

Основные принципы ООП

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

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

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

интерфейс

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

реализация

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

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

Как уже говорилось выше, объединение полей данных и процедур и функций,

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

Наличие интерфейса обеспечивает уменьшение возможности « разрушения»

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

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

Страница 26 из 51

Основные принципы ООП

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

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

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

Операция создания и инициализация полей объекта получила название

конструирования объекта, а операция уничтожения объекта - деструкции

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

Пример 1.7. Сокрытие реализации класса (класс Файл -продолжение примера 1.5). В соответствии с результатами объектной декомпозиции (см. рис.

1.13). Файл должен реагировать на следующие сообщения: « Открыть»,

« Добавить запись», « Найти запись».

Каждое сообщение должно дополняться необходимой информацией. Так,

сообщение « Открыть» должно сопровождаться передачей имени файла.

Сообщение « Добавить запись» должно сопровождаться передачей текста

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

Страница 27 из 51

Основные принципы ООП

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

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

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

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

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

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

Класс Файл: интерфейс

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

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

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

Страница 28 из 51

Основные принципы ООП

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

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

реализация

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

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

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

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

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

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

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

Основные средства разработки классов

Языки, поддерживающие ООП, существенно облегчают разработчику создание новых классов за счет реализации механизмов наследования,

композиции, наполнения и полиморфизма.

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

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

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

Если непосредственный родитель единственный, то наследование называется простым, а если таких классов несколько - то множественным. При

Страница 29 из 51

Основные принципы ООП

этом класс родитель (или классы родители) и класс потомок образуют иерархию

(рис.).

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

Пример. Наследование (класс Окноменяющеецвет). Построим на базе класса Окно класс-потомок, который может изменять цвет окна на экране. Для этого к родительскому классу достаточно добавить метод Изменить_цвет:

Класс Окно_меняющее_цвет - родитель: класс Окно:

метод Изменить_цвет(аСоlor);

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

Класс Окно_меняющее_цвет содержит все поля родительского класса и все его методы. Дополнительно объекты типа Окно_меняющее_цвет могут менять цвет окна на указанный в сообщении « Изменить_цвет» ( рис. 1.20).

Страница 30 из 51 Основные принципы ООП

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

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

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

из мен яютс я по с ут и .

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

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

П р и м е ч а н и е . Термин «полиморфизм» в программировании, в соответствии со своим изначальным смыслом («многообразие»), используется для обозначения встроенного механизма определения соответствия кода функции типу параметров. Такой механизм реализуется не только в средствах ООП.

Различают несколько терминов, связанных с конкретными механизмами реализации полиморфизма для различных случаев:

чистый полиморфизм - используется для обозначения того, что один код функции может по-разному ин т ерпрети ров ат ься в зависимости от типа аргументов; используется в языках высокого уровня абстракции, например, в языке LISP или SMALLTALK;

перегрузка (полиморфные имена функций) - используется, когда определяется несколько функций с одним именем - одно и то же имя функции может многократно использоваться в разных местах программы; выбор нужной функции может определять типами аргументов,

областью видимости (внутри модуля, файла, класса и т.д.); если выбор определяется типом аргументов, то перегрузка называется параметрической; например, язык С++ позволяет разработчику выполнять параметрическую перегрузку функций вне классов;