Составные фигуры
Составные фигуры
Следующий пример больше чем пример, - он послужит нам образцом проектирования классов в самых различных ситуациях.
Рассмотрим структуру, введенную в предыдущей лекции для изучения наследования и содержащую классы графических фигур: FIGURE, OPEN_FIGURE, POLYGON, RECTANGLE, ELLIPSE и т.д. До сих пор в этой структуре использовалось лишь единичное наследование.
Рис. 15.8. Элементарные фигуры
Пусть в этой иерархии представлены все нужные нам базовые фигуры. Однако в библиотеку классов хотелось бы включить и не базовые фигуры, имеющие широкое распространение. Конечно, любое изображение каждый раз можно строить из примитивов, но это неудобно. Поэтому мы создадим библиотеку фигур, часть которых будут базовыми, а часть - построена на их основе. Так, из экземпляров базисных классов: отрезка и окружности можно собрать колесо:
Рис. 15.9. Составная фигура
Колесо, в свою очередь, может пригодиться при рисовании велосипеда, и т. д.
Итак, нам необходим универсальный механизм создания новых фигур, построенных на основе существующих, но, будучи построенными, используемыми наравне с базовыми.
Назовем новые фигуры составными (COMPOSITE_FIGURE). Каждую такую фигуру, безусловно, надо порождать от FIGURE, что позволит ей быть "на равных" с базовыми примитивами. Составная фигура - это еще и список фигур, ее образующих, каждая из которых может быть базовой или составной. Воспользуемся множественным наследованием (рис. 15.10).
Для получения эффективного класса COMPOSITE_FIGURE выберем одну из возможных реализаций списка, например связный список - LINKED_LIST. Объявление класса будет выглядеть так:
class COMPOSITE_FIGURE inherit
FIGURE
LINKED_LIST [FIGURE]
feature
...
end
Рис. 15.10. Составная фигура - это фигура и список фигур одновременно
Предложение feature записывать приятно вдвойне. Работа с составными фигурами во многом сводится к работе со всеми их составляющими. Например, процедура display может быть реализована так:
display is
-- Отображает фигуру, последовательно отображая все ее компоненты.
do
from
start
until
after
loop
item.display
forth
end
end
Как и в предыдущих рассмотрениях, мы предполагаем, что класс список предлагает механизм обхода элементов, основанный на понятии курсора. Команда start устанавливает курсор на первый элемент, если он есть (иначе after сразу же равно True), after указывает, обошел ли курсор все элементы, item дает значение элемента, на который указывает курсор, forth передвигает курсор к следующему элементу.
Я нахожу эту схему прекрасной и, надеюсь, вы тоже пленитесь ее красотой. В ней вы найдете почти весь арсенал средств: классы, множественное наследование, полиморфные структуры данных (LINKED_LIST [FIGURE]), динамическое связывание (вызов item.display применяет метод display того класса, которому принадлежит текущий элемент списка), рекурсию (каждый элемент item сам может быть составной фигурой без ограничения глубины вложенности). Подумать только: есть люди, которые могут прожить всю жизнь и не увидеть этого великолепия!
Но можно пойти еще дальше. Обратимся к другим компонентам COMPOSITE_FIGURE - методам вращения (rotate) и переноса (translate). Они также должны выполнять надлежащие операции над каждым элементом фигуры, и каждый из них может во многом напоминать display. Для ОО-проектировщика это может стать причиной тревоги: хотелось бы избежать повторения; потому выполним преобразование - от инкапсуляции к повторному использованию. (Это могло бы стать девизом.) Техника, рассматриваемая здесь, состоит в использовании отложенного класса "итератор", чьи экземпляры способны выполнять цикл по COMPOSITE_FIGURE. Его эффективным потомком может стать DISPLAY_ ITERATOR, а также ряд других классов. Реализацию этой схемы мы оставляем читателю (см. упражнение 15.4).
Описание составных структур с применением множественного наследования и списка или иного контейнерного класса, как одного из родителей, - это универсальный образец проектирования. Примерами его воплощения являются подменю (см. упражнение 15.8), а также составные команды в ряде интерактивных систем.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Составные сообщения
Составные сообщения До сих пор мы демонстрировали только обмен сообщениями, когда данные передаются из одного буфера в адресном пространстве клиента в другой буфер в адресном пространстве сервера (и наоборот — в случае ответа на сообщение).При том, что данный подход
21.3.4. Составные управляющие последовательности
21.3.4. Составные управляющие последовательности Пять двухсимвольных управляющих последовательностей (которые показаны в табл. 21.3) фактически являются префиксами более длинных и сложных последовательностей. Рассмотрим каждую из них по очереди.Таблица 21.3. Составные
SeoPult: приборы, карты, фигуры пилотажа
SeoPult: приборы, карты, фигуры пилотажа Смысл SeoPul как сервиса заключен в его имени. Это пульт, с которого удобно управлять каналами продвижения в Интернете, меняя картинку несколькими нажатиями. С той лишь разницей, что пульт телевизионный (ПДУ) в шутку, но справедливо
Урок 13 Пути с фигурами, или Фигуры среди путей
Урок 13 Пути с фигурами, или Фигуры среди путей Растровый редактор Photoshop не был бы столь велик и могуч, если бы его пользователи, помимо работы с растровыми объектами, не могли редактировать еще и нерастровые. Работу с текстом мы уже изучили. В этом уроке мы узнаем, как
Составные объекты
Составные объекты Используя вкладку Create (Создание) командной панели можно объединять два и более объектов для создания нового параметрического объекта Compound Object (Составной объект). Параметры объектов, содержащихся в составном объекте, также можно модифицировать и
Составные объекты
Составные объекты Составные объекты (Compound objects) – это объекты, которые являются результатом взаимодействия двух или более тел. Используя составные объекты, можно деформировать, разрезать, соединять, удалять и выдавливать поверхности, создавать упорядоченные или
Изменение формы фигуры
Изменение формы фигуры При изменении формы фигуры используют желтые ромбовидные маркеры, однако сфера их применения ограничена. Вы можете изменить геометрию фигуры в более широком диапазоне, преобразовав ее в полилинию.1. Выделите прямоугольник.2. Нажмите кнопку
Составные операторы (блоки)
Составные операторы (блоки) "Составной оператор" представляет собой два или более операторов, объединенных с помощью фигурных скобок; он называется также "блоком". В нашей программе размер обуви 2 мы использовали такой оператор, чтобы иметь возможность включить в
Заполненные фигуры
Заполненные фигуры FrameRect Функция FrameRect рисует границу вокруг заданного прямоугольника, используя указанную кисть. Ширина и высота границы всегда равны одной логической единице. int FrameRect ( HDC hDC , // дескриптор контекста устройства CONST RECT *lprc , // указатель на координаты
5.1. Простые и составные инструкции
5.1. Простые и составные инструкции Простейшей формой является пустая инструкция. Вот как она выглядит:; // пустая инструкцияПустая инструкция используется там, где синтаксис С++ требует употребления инструкции, а логика программы – нет. Например, в следующем цикле while,
Фигуры
Фигуры В программе mimio Блокнот есть ограниченный набор фигур: прямоугольник, эллипс, равнобедренный треугольник, прямоугольный треугольник, пятиконечная звезда, пятиугольник, шестиугольник. С фигурами можно выполнять стандартные действия: им можно задавать размер
Невероятные фигуры
Невероятные фигуры Зачастую профессия фотографа обязывает создавать работы, привлекающие внимание зрителя. Если нужно создать композицию для рекламы, а сам рекламируемый товар или услуга – не лучший объект для съемки (например, что фотографировать, если рекламируется