Основы программирования (947332), страница 51
Текст из файла (страница 51)
9.1. Диаграмма объектов предметной областиТаким образом, при выполнении объектной декомпозиции определяют иописывают множество объектов предметной области и множество сообщений, которое формирует и получает каждый объект.Задание для самопроверкиВыполнить объектную декомпозицию предметной области задания 2 кпараграфу 8.4.9.2. Классы и объекты-переменныеВ программе для представления объектов предметной области используют переменные специальных типов - классов.Класс - это структурный тип данных, который включает описание полейданных, а также процедур и функций, работающих с этими полями данных.Применительно к классам такие процедуры и функции получили названиеметодов,Поля, описанные в классе, используют для хранения составляющих состояния или атрибутов объекта.
Например, если объект Функция долженхранить номер функции, то реализующий его класс должен содержать соответствующее поле.305Часть 2. Объектно-ориентированное программированиеИмя объектаИмя классаИмя объектаСостояниеПоляЗначенияПоведениеМетодыМетодыОбъектпредметной областиКлассОбъектпеременнаяРис. 9.2. Соответствие объектов предметной области, классам иобъектам-переменнымКаждый метод определяет реакцию на некоторое внешнее или внутреннее сообщение. Например, объект Меню операций должен реагировать насообщение Активизировать. Получив это сообщение, объект должен вывести меню операций и организовать работу с этим меню, т.е.
при выборе некоторой операции формировать сообщение соответствующему объекту, передавая ему управление, а получив управление обратно, вновь вывести своеменю и ожидать ввода номера операции.Переменные типа класса также обычно называют объектами. При необходимости в тексте данного учебника будем уточнять, что имеются в видуобъекты-переменные или объекты предметной области. На рис.
9.2 показанасвязь объектов предметной области, классов и объектов-переменных.Согласно общим правилам языка программирования объект-переменнаядолжен быть:• создан - для него должна быть выделена память;• инициализирован - полям объекта должны быть присвоены значения;• уничтоэ1с.ен - память, выделенная под объект, должна быть освобождена.В зависимости от способа выделения памяти под объект-переменнуюразличают статические объекты, память под которые выделяется при компиляции программы, и динамические, выделение памяти под которые производится в процессе выполнения программы.9.3.
Методы построения классовОдним из наиболее значимых достоинств ООП является то, что большинство классов для реализации объектов не приходится разрабатывать «снуля». Обычно классы строят на базе уже существующих, используя механизмы, реализующие определенное отношение существующего и строящегоклассов между собой: наследование, композицию, агрегацию и полиморфноенаследование.Наследованием или обобщением называют отношение между классами,при котором один класс строится на базе второго посредством добавления3069. Основные теоретические подоэ/сенияполей и определения новых методов. При этом исходный класс, на базе которого выполняется построение, называют родительским, или базовым, илисупертипом, а строящийся класс - потомком, или производным классом, илиподтипом.При наследовании поля и методы родительского класса повторно не определяют, специальный механизм наследования позволяет использовать этикомпоненты класса, особо этого не оговаривая.Примечание.
В Borland Pascal реализовано только простое наследование, при которомкласс может иметь всего одного родителя. В теории программирования определено такжемножественное наследование, предполагающее наличие у класса двух и более родителей. Такой вариант наследования реализован, например, в C++.Наследование свойств в иерархии существенно упрощает работу программиста. В настоящее время созданы библиотеки наиболее часто встречающихся классов, которые можно использовать вновь и вновь, строя на их основе классы для решения различных задач.Отношения между различными классами проекта принято иллюстрировать диаграммой отношений классов, или просто диаграммой классов. Еслина диаграмме классов показано только отношение наследования, то такуюдиаграмму называют иерархией классов. На диаграмме классов наследование изображают линией с треугольной незакрашенной стрелкой на конц^, направленном к классу-родителю (рис.
9.3, а, б). При необходимости допускается произвольное расположение классов родителей и потомков (рис. 9.3, в).Кроме отношения между классами на диаграмме классов целесообразноуказывать поля и методы каждого или только строящегося класса, так как этопозволяет уточнить структуру разрабатываемых классов. Примеры диаграммклассов с уточняющим описанием приведены в главах 10-12.Композицией называют такое отношение между классами, когда один является неотъемлемой частью второго.
Физически композиция реализуется'КлассродительКлассродительtГКласспотомокпотом ок 1^ПКласспотомок—{>КлассродительПОТ()мок2Рис. 9.3. Примеры иерархий классов:flf - с одним потомком; б-с двумя потомками; в - с нестандартным расположением классов307Часть 2. Объектно-ориентированное программирование2..41Класс-часть1ОсновнойклассОсновнойкласс21Класс IКласс 2Класс 3Рис. 9.4. Примеры диаграмм классов, изображающих композицию:а — с одним объектным полем; б— с несколькими объектными полями различных типоввключением в класс фиксированного количества полей, являющихся объектами другого класса. Такие поля обычно называют объектными.На диаграмме классов композицию изображают линией с закрашеннымромбом, указывающим на класс большей сложности, в который происходитвключение объектных полей (рис. 9.4, а).
Для большей информативностиимеет смысл указывать над стрелкой количество объектов включаемого класса в каждый объект включающего класса. При этом допускается указыватьточное значение или диапазон (рис. 9.4, б).Наполнением или агрегаг^ией называют такое отношение между классами, при котором точное количество объектов одного класса, включаемых вдругой класс, не ограничено и может меняться от О до достаточно большихзначений. Физически наполнение реализуется с использованием указателейна объекты. В отличие от объектного поля, которое включает в класс точноуказанное количество объектов (1 или более - при использовании массиваобъектов или нескольких объектных полей) конкретного класса, использование указателей позволяет включить О или более объектов, если они собраныв массив или списковую (линейную или нелинейную) структуру.На диаграмме классов наполнение изображают аналогично композиции,но ромб не закрашивают (рис.
9.5), обозначая таким образом менее жесткуюсвязь между объектами соответствующих классов. Количество объектов указывают в виде диапазона, например, «0..*» или «1 ..*», или просто «*», что означает неопределенное множество объектов.0..*КлассПолиморфным наследованием назыКласс-часть-<он агрегатвают наследование, при котором осуществляют переопределение методов классаРис.
9.5. Пример диаграммыродителя потомком. Метод потомка вклассов, изображающейэтом случае имеет то же имя, что и методагрегацию или наполнениеродителя, но выполняет другие действия.3089. Основные теоретические положенияПереопределение методов - частный случай реализации полиморфизмав программировании.Примечание. Термин «полиморфизм» в соответствии со своим изначальным смыслом(«многообразие») в программировании используют для обозначения возможности изменениякода программы в соответствии со значением некоторых параметров. Такая возможность существует не только в ООП.Различают:• чистый полиморфизм ~ возможность различной интерпретации кода функции в зависимости от типа аргументов; используется в языках высокого уровня абстракции, например, вязыке LISP или SMALLTALK;• перегрузку {полиморфные имена) функций - возможность определения несколькихфункций с одним именем - одно и то же имя функции может многократно использоваться вразных местах программы; выбор нужной функции может определяться типами аргументов,областью видимости (внутри модуля, файла, класса и т.д.); если выбор определяется типом аргументов, то перефузка называется параметрической', например, язык С-и- позволяет разработчику выполнять параметрическую перегрузку функций вне классов, а в Borland Pascal возможно определение функций с одинаковыми именами в различных модулях или в модуле иосновной программе;• переопределение методов - в ООП возможность различных определений методов вклассе-потомке и классе-родителе; конкретный метод определяется классом объекта, для которого он вызывается;• обобщенные функции, или шаблоны - возможность описания параметризованныхклассов и шаблонов функций (реализована в C++), параметрами таких описаний являются типы аргументов методов или функций.При переопределении методов различают простой и сложный полиморфизм.Простой полиморфизм используют, если при вызове переопределенного метода тип объекта, для которого вызывается этот метод, точно известен,а, следовательно, и точно известно, какой метод должен быть подключен: метод родителя или метод потомка.