Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

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



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

Постановка задачи:

Требуется изменить созданную ранее иерархию классов для основных графических примитивов с целью использования виртуальных методов. Для этого в иерархию классов необходимо внести некоторые изменения.

Порядок выполнения работы:

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

2. Внести в базовый класс фигур следующие изменения:

· абстрактный метод прорисовки объявить виртуальным;

· метод перемещения сделать реальным, с вызовом виртуального метода прорисовки.

3. Во все дочерние классы внести следующие изменения:

· объявить метод прорисовки переопределяемым, оставив без изменения его программную реализацию;

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

4. Проверить работоспособность созданных классов.

Задание 2. Использование полиморфных объектных указателей.

Постановка задачи:

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

· заполнение массива указателями на случайно выбранные фигуры;

· показ всех фигур в массиве;

· стирание всех фигур в массиве;

· перемещение сразу всех фигур в новую базовую точку;

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

· уничтожение массива фигур с освобождением памяти.

Порядок выполнения работы:

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

2. При необходимости внести в базовую библиотеку дополнения: библиотека должна содержать не менее трех уровней (например, ветку наследования классов TFigure – TCircle – TEllipse) и 5-6 классов.

3. В разделе реализации основного модуля объявить массив из 20-30 полиморфных указателей, т.е. элементов базового типа TFigure.

4. В основное меню ввести команду Массив с подкомандами Создать, Уничтожить, Стереть, Показать и Переместить.

5. Написать обработчик команды Создать, который должен в цикле создать случайный набор из 20-30 фигур со случайными параметрами и сохранить указатель на каждый из них как элемент массива, например:

mas[ i ]:= TCircle.Create(параметры);

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

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

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

8. Написать обработчик команды Уничтожить для стирания изображения всех фигур и уничтожения соответствующих объектов; для этого в цикле для каждого указателя вызывается метод Show и затем метод Free.

9. Написать код, который перемещает все изображение влево-вправо-вверх-вниз по нажатию соответствующей клавиши. Для простоты шаг перемещения можно взять равным 10 пикселам. Для реализации необходимо:

· установить свойство формы KeyPreview=true для перехвата формой клавиатурного ввода;

· создать обработчик события формы OnKeyDown;

· в этом обработчике проверить по Case-Of значение параметра Key, используя стандартные виртуальные коды клавиш vk_Left, vk_Right, vk_Up, vk_Down;

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

10. Сохранить проект и проверить его работу.

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

12. Проверить работу приложения.

13. Добавить возможность вызова при проходе по массиву уникального метода для заданной подиерархии, например – изменения радиуса окружности (он же горизонтальная полуось эллипса). Для этого кроме проверки динамического типа указателя, надо выполнить его приведение к базовому подтипу, например – типу TCircle; для приведения используется операция as, после применения которой появляется возможность вызова с помощью полиморфного указателя методов подкласса (например, методов класса TCircle).

14. Проверить работу приложения.

Задание 3. Создание и использование контейнерных классов.

Постановка задачи:

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

Порядок выполнения работы:

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

2. В разделе интерфейса этого модуля:

· подключить модуль с графической библиотекой;

· описать либо базовый класс контейнера-массива, либо два класса – класс элементов списка и класс самого контейнера-списка.

3. В разделе реализации записать код всех методов описанных классов. Особое место среди методов контейнера занимает метод-итератор, который организует проход по массиву или списку и с каждым объектом-примитивом выполняет заданное действие. В простейшем случае итератор можно оформить как метод, принимающий входной параметр-признак выполняемого действия. Внутри метода с помощью инструкции Case можно выбрать требуемое действие и внутри цикла применить его к каждому объекту. Можно предусмотреть выполнение следующих действий: перемещение примитива на заданное смещение, показ/стирание примитива, уничтожение примитива со стиранием.

4. В разделе реализации главного модуля подключить контейнерный модуль, ввести переменную-указатель на объект-контейнер и переменную-указатель на любой примитив (типа TFigure).

5. Добавить в основное меню команду Контейнер с элементами Создать, Добавить, Переместить, Уничтожить.

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

7. Написать обработчик команды Добавить, в котором создать случайный примитив со случайными параметрами, добавить его в контейнер и показать методом Show.

8. Написать обработчик команды Переместить, который лишь вызывает итератор с соответствующими параметрами.

9. Написать обработчик команды Уничтожить, который с помощью итератора уничтожает все объекты-примитивы, затем уничтожает методом Free сам контейнер и выводит об этом сообщение.

10. Сохранить проект и проверить его работу.

Контрольные вопросы

1. Что такое полиморфизм и какие проявления он имеет?

2. Что такое переопределение методов и чем оно отличается от перегрузки?

3. Чем объясняется необходимость использования механизма переопределения методов?

4. Что такое статическая и динамическая компоновка, их преимущества и недостатки?

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

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

7. Какие связи выстраиваются в памяти при выполнении объектной программы с виртуальными методами?

8. Какие особенности имеет использование механизма виртуальных методов в разных языках?

9. Что такое полиморфные объектные указатели?

10. Какие правила используются в механизме полиморфных указателей?

11. Какие преимущества дает объединение полиморфных указателей в массив?

12. Как используются полиморфные указатели при передаче параметров методам?

13. Какие сложности возникают при использовании полиморфных указателей?

14. Что такое метаданные и что они содержат?

15. Какие связи между таблицами-структурами создаются при выполнении объектной программы?

16. Как выполняется проверка текущего динамического типа полиморфных указателей?

17. Как можно организовать выборочную обработку объектов некоторой подиерархии?

18. Как и зачем выполняется приведение типов полиморфных указателей?

19. Что выполняют операторы is и as в языке Delphi Pascal?

20. Как выполняется проверка динамического типа объектного указателя и его приведение в языке Java?

21. Что такое контейнеры и как их можно реализовать?

22. Как реализуется контейнерный класс на основе обычного массива?

23. Как реализуется контейнерный класс на основе динамического массива?

24. Как реализуется контейнерный класс на основе динамического списка?





Дата публикования: 2014-11-02; Прочитано: 791 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.009 с)...