|
Программирование >> Структурное программирование
Замечания по технике программирования 10.1. Интересным следствием использования виртуальных функций и полиморфизма является то, что программы приобретают более простой вид. Они включают меньше логических ветвлений и больше простого последовательного кода. Это упрощение облегчает тестирование, отладку и сопровождение программ. 10.2. Если функция однажды объявлена виртуальной, то она остается виртуальной на любом более низком уровне иерархической структуры. 10.3. Если в производном классе решено не описывать виртуальную функцию, то производный класс непосредственно наследует описание виртуальной функции из базового класса. 10.4. Переопределенная виртуальная функция должна иметь тот же самый тип возвращаемого значения и ту же сигнатуру, что и виртуальная функция базового класса. 10.5. Если класс является производным от класса с чистой виртуальной функцией и если эта чистая виртуальная функция не описана в производном классе, тогда функция остается чистой виртуальной и в производном классе. Следовательно, такой производный класс также является абстрактным классом. Хороший стиль программирования 10.1. Несмотря на то, что некоторые функции могут быть неявно виртуальными, поскольку они объявлены такими на более высоком уровне иерархии, некоторые программисты предпочитают явно объявлять функции виртуальными на каждом уровне иерархии, чтобы обеспечить ясность программы. 10.2. Если у класса имеются виртуальные функции, предусматривайте создание виртуального деструктора, даже если он не требуется этому классу. Классы, производные от данного класса, могут содержать деструкторы, которые должны вызываться соответствующим образом. Советы по повышению эффективности 10.1. Полиморфизм, реализуемый с помощью виртуальных функций и динамического связывания, очень эффективен. Программисты могут использовать это средство при ничтожном влиянии на производительность системы. 10.2. Виртуальные функции и динамическое связывание позволяют использовать полиморфное программирование как альтернативу логике оператора switch. Оптимизирующие компиляторы С-Ы- обычно генерирует код, который исполняется по крайней мере так же эффективно, как код, построенный вручную на основе логики оператора выбора switch. 10.6. Благодаря виртуальным функциям и полиморфизму программист может управлять общими свойствами объектов, предоставляя возможность программной среде во время выполнения программы самой заботиться о специфике объектов. Программист может управлять широким спектром объектов, даже не зная об их типах, причем управление будет автоматически учитывать специфику этих объектов. 10.7. Полиморфизм способствует расширяемости: программное обеспечение, использующее полиморфный механизм, пишется независимо от типов объектов, которым отправляются сообщения. Таким образом, новые типы объектов, которые должны реагировать на соответствующие сообщения, могут включаться в такую систему без модификации ее основы. За исключением кода пользователя, который создает новые объекты, программа не потребует перекомпиляции. 10.8. Абстрактный класс определяет интерфейс для разных типов элементов иерархии классов. Абстрактный класс включает чистые виртуальные функции, которые будут определены в производных классах. Все функции в иерархии могут применять один и тот же интерфейс, используя полиморфизм. Упражнения для самопроверки 10.1. Заполните пробелы в следующих утверждениях: a) Использование наследования и полиморфизма помогает исключить логику . b) Чистая виртуальная функция задается с помощью размещения в конце ее прототипа в определении класса. c) Если класс содержит хотя бы одну чистую виртуальную функцию, он является . d) Вызов функции, обрабатываемый во время компиляции, называется связыванием. e) Вызов функции, обрабатываемый во время выполнения программы, называется связыванием. Ответы на упражнения для самопроверки 10.1. а) структуры switch. Ь) = О. с) абстрактным базовым классом, d) статическим, е) динамическим. Упражнения 10.2. Что такое виртуальные функции? Опишите случаи, в которых использование виртуальных функций было бы оправдано. 10.3. Учитывая, что конструкторы не могут быть виртуальными, опишите схему, по которой вы могли бы достичь аналогичного эффекта. 10.4. Как понимать, что полиморфизм позволяет вам осуществлять общий подход к программированию, не вдаваясь в конкретику классов. Приведите основные преимущества общего подхода к программированию. 10.5. Рассмотрите проблемы программирования, связанные с использованием логики оператора выбора switch. Объясните, почему полиморфизм является мощной альтернативой использованию логики оператора switch. 10.6. Выявите различия между статическим и динамическим связыванием. Объясните использование виртуальных функций и таблиц виртуальных методов при динамическом связывании. 10.7. Выявите различия между наследованием интерфейса и реализаций. Чем отличаются иерархические структуры, разработанные для наследования интерфейса, от иерархических структур, разработанных для наследования реализаций? 10.8. Выявите различия между виртуальными функциями и чистыми виртуальными функциями. 10.9. {Правильно или ошибочно) Все виртуальные функции в абстрактном базовом классе должны быть объявлены как чистые виртуальные функции. 10.10. Предложите один или более дополнительных уровней абстрактных базовых классов для иерархии Shape, рассмотренной в данной главе (первый уровень - Shape, второй - классы TwoDimensionalShape и TwoDimensionalShape). 10.11. Каким образом полиморфизм способствует расширяемости? 10.12. Создайте эскиз моделирующей программы, которая выводит сложные графические объекты. Объясните, почему полиморфное программное обеспечение будет особенно эффективно при решении задач такого рода. 10.13. Создайте базовый графический пакет. Используйте иерархию наследования класса Shape из главы 9. Ограничьтесь двумерными графическими объектами, такими, как квадраты, прямоугольники, треугольники и окружности. Обеспечьте интерактивное взаимодействие с пользователем. Предоставьте возможность пользователю задавать позицию, размер, форму и заполняющий символ, используемый при изображении каждой формы. Пользователь должен иметь возможность задавать несколько объектов одной и той же формы. Когда вы создаете каждую форму, помещайте указатель Shape * на этот новый объект в массив. Каждый класс имеет собственную функцию-элемент draw. Напишите полиморфный экранный администратор, который будет проводить поиск в массиве (желательно с помощью итератора) и посылать сообщения нарисовать (обращение к функции-элементу draw) каждому объекту в массиве для формирования экранного образа. Перерисовывайте весь экран каждый раз, когда пользователь задает очередную форму.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |