Основы программирования (947332), страница 52
Текст из файла (страница 52)
В этом случае нужный метод определяетсяна этапе компиляции программы {раннее связывание).Слоэюный полиморфизм используют, если при вызове переопределенного метода необходимо уточнить, какой метод должен быть подключен: методродителя или метод потомка, так как объект, для которого вызывается переопределенный метод, может быть как объектом класса родителя, так и объектом класса потомка. В этом случае нужный метод определяется на этапевыполнения программы {позднее связывание), когда тип объекта точно известен. Позднее связывание обязательно должно реализовываться в конкретныхслучаях, которые будут перечислены в параграфе 11.5.Для выявления отношения имеющегося и строящегося классов необходимо выполнить анализ структуры объектов предметной области, полученных в результате объектной декомпозиции.309Часть 2.
Объектно-ориентированное программированиеЕсли объекты предметной области слишком сложны, чтобы ставить имв соответствие некий простой класс, то процесс декомпозиции можно продолжить, выделяя внутри сложных объектов более простые.При этом возможны следующие варианты.1.
Внутри объекта можно выделить объект близкого назначения, но с более простой структурой и/или поведением ~ класс для реализации данногообъекта следует строить на базе более простого, используя наследование. Если при этом объекты строящегося класса отличаются от объектов базовогокласса некоторыми аспектами поведения, то следует изменить поведениеобъектов строящегося класса при наследовании, используя полиморфное наследование с переопределением методов.2. Внутри объекта можно выделить определенное количество объектовболее простой структуры со своим поведением - класс строится объединением объектов других классов с добавлением полей и методов строящегосякласса - композиция классов.3.
Внутри объекта можно выделить заранее не предсказуемое количество объектов более простой структуры со своим поведением - класс строитсяс возможностью динамического подключения объектов других классов (наполнение) и добавлением полей и методов строящегося класса.Рассмотрим два примера.Пример 9.2. Разработать класс для реализации объекта «Текст», который должен:• для каждого слова некоторой последовательности слов хранить его атрибуты (тип шрифта и размер букв);• определять количество слов в тексте;• добавлять слова после слов с указанными номерами;• удалять заданные слова из текста;• менять местами слова с заданными номерами;• заменять заданное слово на другое заданное во всем тексте;• переопределять атрибуты слова с заданным номером.Итак, реализуемый объект должен оперировать с некоторыми внутренними объектами «Словами», для которых можно определить собственное состояние и поведение.
Естественно создать специальный класс TWord для реализации «Слов». Класс TText для реализации «Текста» может быть построен как с использованием композиции, так и с использованием наполнения.В первом случае он должен включать массив объектов класса TWord.Максимальное количество элементов массива должно быть определено заранее и, следовательно, ограничено (рис. 9.6, а). При выполнении операцийудаления и вставки придется сдвигйть и раздвигать элементы массива.310p.
Основные теоретические пололсенияTWordfont, sizeSetFont()SetSize()TWordfont, size, nextSetFont()SetSize()L.nmax0..*TTextn, nmax, MasW(nmax)Length (), Add (), Del(),SetAttrO, Chang 1{),Chang2()TTextpFirst;^TWord<>\ Length (), Add (), Del(),SetAttrO, Chang 1(),Chang2()Рис. 9.6. Диаграммы классов для реализации объекта Текст:а - с композицией; 6-Q наполнениемВо втором случае класс TText должен включать список объектов классаTWord (рис. 9.6, б). Ограничения предыдущей реализации будут сняты, нореализация со списком имеет несколько большую трудоемкость, и, кроме того, при обращении к слову по номеру придется каждый раз последовательноотсчитывать нужный элемент.
Выбор конкретного варианта реализации зависит от условий решаемой задачи.Пример 9.3. Разработать классы для реализации объектов Табулятор,Определитель корней и Определитель экстремумов из примера 9.1.Объекты Табулятор, Определитель корней и Определитель экстремумовотвечают за реализацию методов решения некоторых частных задач при исследовании функций.
Они имеют много общего. Попробуем определить этообщее.Любой объект, получив управление, должен ввести диапазон измененияаргумента [а, Ь], решить подзадачу, вывести результаты, а затем вернуть управление меню операций. Общее поведение и поля объектов опишем в классе TMetod. Основной метод этого класса Run должен реализовывать общееповедение и обеспечивать возможность изменения элементов этого поведения (решения конкретных подзадач) для объектов классов, которые будут отнего наследоваться. Решение конкретной подзадачи реализуем как внутренний метод Task, вызываемый из метода Run.
Этот внутренний метод длякласса TMetod определять не будем (абстрактный метод).Классы для реализации разрабатываемых объектов наследуем отTMetod, переопределяя метод Task и добавляя недостающие поля (рис. 9.7).На диаграмме курсивом показано, что класс TMetod и метод Task являютсяабстрактными. При необходимости это указывают явно, используя слово«abstruct».311Часть 2. Объектно-ориентированное программированиеTMetodа, b.realRun ОTMainMenuTask 01ТТаЫеh:realTask ( )f1TMaxMineps.realTaskOОпредьллс!1TRooteps:realTask ( )Рис.
9.7. Иерархия классов для реализации объектовпримераФункцияРис. 9.8. ПримерассоциацииПомимо определенных выше, на диаграмме классов показывают такжеотношения ассоциации между классами, объекты которых обмениваются сообщениями, но не связаны отношениями композиции или агрегации.
Ониобозначаются линиями без стрелок. Если сообщения передаются в одну сторону, то направление ассоциации можно показать стрелкой над линией. Кроме того, ассоциации можно дать имя, которое в данном контексте называютролью (рис. 9.8).После разработки диаграммы классов переходят к их реализации в конкретном языке программирования. Особенности реализации классов будутобсуждаться в главах 10 - 11.9.4. Этапы реализации объектно-ориентированного подходаПроцесс разработки программного обеспечения с использованием объектно-ориентированного подхода включает те же основные этапы, что и сиспользованием структурного подходы: анализ, проектирование, реализацию и модификацию. Однако процедуры, выполняемые на каждом этапе, несколько меняются.
Кроме того, этап реализации при объектном подходе называют эволюцией, что также связано с его особенностями.Рассмотрим эти этапы.Анализ предметной области задачи. Цель анализа - максимально полное описание задачи. На этом этапе выполняют объектную декомпозициюразрабатываемой системы и определяют основные особенности поведенияобъектов.
Результаты объектной декомпозиции представляют в виде диаграммы объектов, на которой показывают основные объекты и сообщения,передаваемые между ними.Проектирование системы. Логическое проектирование при объектномподходе заключается в разработке структуры классов: определяют поля дляхранения составляющих состояния объектов и алгоритмы методов, реализующих аспекты поведения объектов. При этом используют рассмотренныевыше механизмы реализации отношений классов (наследование, компози312p. Основные теоретические полоэюенияция, наполнение и полиморфизм).
Результатом является иерархия или диаграмма классов, отражающая отношения между классами и включающая ихописание.Физическое проектирование заключается в объединении описаний классов в модули, определении способов взаимодействия с оборудованием, с операционной системой и/или другим программным обеспечением (например,базами данных, сетевыми программами), обеспечении синхронизации процессов для систем параллельной обработки и т.д.
Результаты физическогопроектирования представляют в виде схемы композиции классов в модули,описания интерфейсов для взаимодействия с другими программами и т. п.Эволюция системы. Эволюция системы - это процесс поэтапной реализации классов и подключения объектов к системе. Само название этапаподчеркивает поэтапный характер процесса, упрощающий сборку системы.Реализацию начинают с создания основной программы или проекта будущего программного продукта.
Затем описывают классы и подключаютобъекты этих классов так, чтобы создать грубый, но, по возможности, работающий прототип будущей системы, который тестируют и отлаживают.Например, на первых этапах эволюции проект может включать толькообъекты, реализующие основной интерфейс программного продукта. Наданном этапе передача сообщений в отсутствующую пока часть системы невыполняется. Отлаженный прототип системы может быть, например, показан заказчику для уточнения требований.Далее к проекту подключают следующую группу классов, например,связанных с реализацией некоторого пункта меню. Полученный вариант также тестируется и отлаживается, и так далее, до реализации всех возможностей системы.Модификация.