Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции - Часть 9.doc
Скачиваний:
35
Добавлен:
02.05.2014
Размер:
5.57 Mб
Скачать

9.10. Внутренние программные классы

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

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

9.11. Применение наследования при проектировании

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

9.11.1. Иерархии классов. Иерархии классов (называемые также иерархиями обобщения/специализации или иерархиями наследования) допустимо разрабатывать сверху вниз, снизу вверх или в обоих направлениях. При разработке сверху вниз проектируется класс, кото­рый включает характеристики, общие для всех его наследников. В ходе специали­зации этого класса формируются подклассы со специфическими особенностями. Можно поступать и наоборот, если в первоначальном проекте есть классы, имею­щие как общие черты (операции или атрибуты), так и некоторые отличия. В таком случае общие свойства переносятся в суперкласс и наследуются подклассами.

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

9.11.2. Абстрактные классы. У абстрактного класса не может быть экземпляров, поэтому он используется как шаблон для создания классов, а не объектов. Иными словами, он способен выступать только в роли суперкласса, который определяет общий интерфейс для всех своих подклассов. Абстрактная операция – это операция, которая объявле­на, но не реализована в абстрактном классе. Абстрактный класс должен иметь хотя бы одну абстрактную операцию.

Абстрактный класс оставляет реализацию некоторых операций своим под­классам. Подкласс в состоянии реализовывать операции, придерживаясь интер­фейса, заданного своим абстрактным родителем. Различные подклассы абстракт­ного класса могут определять разные реализации одной и той же операции. Таким образом, абстрактный класс задает интерфейс в форме набора абстрактных опе­раций. Подклассы реализуют этот интерфейс и расширяют его, добавляя соб­ственные операции.

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

9.11.3. Полиморфизм и динамическое связывание. Слово «полиморфизм» в переводе с греческого означает «многообразие форм». В объектно-ориентированном проектировании полиморфизм используется, ког­да в различных классах должна существовать операция с одним и тем же именем. Ее спецификация во всех классах одинакова, но реализация может быть различной: это дает возможность во время выполнения использовать вместо одного объекта другой с тем же интерфейсом.

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

Соседние файлы в предмете Системы реального времени