|
Программирование >> Структурное программирование
Резюме Терминология Типичные ошибки программирования Хороший стиль программирования Советы по повышению эффективности Замечания по технике программирования Упражнения для самопроверки Ответы на упражнения для самопроверки Упражнения 9.1. Введение в этой и следующей главах мы обсудим две наиболее важных особенности объектно-ориентированного программирования - наследование и полиморфизм. Наследование - это способ повторного использования программного обеспечения, при котором новые классы создаются из уже существующих классов путем заимствования их атрибутов и функций и обогащения этими возможностями новых классов. Повторное использование кодов экономит время при разработке программ. Это способствует повторному использованию План 9.1. Введение 9.2. Базовые классы и производные классы 9.3. Защищенные элементы 9.4. Приведение типов указателей базовых классов к указателям производных классов 9.5. Использование функций-элементов 9.6. Переопределение элементов базового класса в производном классе 9.7. Открытые, защищенные и закрытые базовые классы 9.8. Прямые и косвенные базовые классы 9.9. Использование конструкторов и деструкторов в производных классах 9.10. Неявное преобразование объектов производных классов в объекты базовых классов 9.11. Проектирование программного обеспечения с помощью наследования 9.12. Композиция и наследование 9.13. Отношения использует А и знает А 9.14. Учебный пример: точка, круг, цилиндр 9.15. Множественное наследование проверенного и отлаженного программного обеспечения и таким образом уменьшает число проблем, возникающих после того, как система начинает функционировать. Это захватывающие возможности. Полиморфизм позволяет нам обычным образом писать программы, обрабатывающие широкий круг как существующих, так и еще даже не описанных родственных классов. Наследование и полиморфизм представляют собой эффективную технику преодоления сложности программного обеспечения. При создании нового класса вместо написания полностью новых данных-элементов и функций-элементов программист может указать, что новый класс является наследником данных-элементов и функций-элементов ранее определенного базового класса. Этот новый класс называется производным классом. Каждый производный класс сам является кандидатом на роль базового класса для будущих производных классов. При простом наследовании класс порождается одним базовым классом. При множественном наследовании производный класс наследует нескольким базовым классам (возможно неродственным). Производный класс обычно добавляет свои собственные данные-элементы и функции-элементы, так что производный класс в общем случае больше своего базового класса. Производный класс более специфичен по своему назначению, более узок, чем его базовый класс, и представляет меньшую группу объектов. При простом наследовании предполагается, что производный класс будет выполнять примерно те же функции, что и базовый класс. Истинная сила наследования заключается в способности определять в производном классе добавления, замены -или усовершенствования черт, унаследованных от базового класса. Каждый объект производного класса является также объектом соответствующего базового класса. Однако, обратное неверно: объект базового класса не является объектом классов, порожденных этим базовым классом. Мы будем использовать достоинства этой связи - объект производного класса является объектом базового класса - для выполнения некоторых интересных операций. Например, мы можем объединить широкий круг различных объектов, связанных наследованием, в связный список объектов базового класса. Тогда мы сможем обрабатывать разные объекты одним общим способом. Как мы увидим в этой и следующей главах, это является ключевым моментом объектно-ориентированного программирования. В данной главе мы узнаем о новой форме управления доступом к элементам, а именно, о защищенном доступе. Производные классы и их друзья получают приоритет перед другими функциями в доступе к защищенным элементам базового класса. Опыт построения систем программного обеспечения показывает, что имеются большие фрагменты программы, которые имеют дело с тесно связанными частными случаями. В таких системах становится трудно видеть картину в целом , потому что проектировщик и программист оказываются озабоченными частными специальными случаями. Объектно-ориентированное программирование обеспечивает несколько способов увидеть лес за деревьями - этот процесс иногда называют абстрагированием. Если программа насыщена тесно связанными частными случаями, то в ней часто встречается оператор переключения switch, который отделяет частные случаи друг от друга и обеспечивает логику их индивидуальной обработки. В главе 10 мы покажем, как использовать наследование и полиморфизм для замены этой логики переключений более простой логикой. Мы делаем различие между отношениями является* и содержит*. Является - это наследование. При отношении является объект типа производного класса является также объектом типа базового класса (может рассматриваться как такой объект). Содержит - это композиция (см. рис. 7.4). При отношении содержит объект класса включает один или более объектов других классов в качестве своих элементов. Производный класс не может иметь доступ к закрытым элементам своего базового класса; разрешение такого доступа явилось бы нарушением инкапсуляции базового класса. Производный класс может, однако, иметь доступ к открытым и заш;ищенным элементам своего базового класса. Элементы базового класса, которые не должны быть доступны производному классу через наследование, объявляются в базовом классе закрытыми. Производный класс может иметь доступ к закрытым элементам своего базового класса только посредством функций доступа, предусмотренных в открытом интерфейсе базового класса. Одной из проблем наследования является то, что производный класс может наследовать открытые функции-элементы, когда в этом нет необходимости или когда это недопустимо. Имеется возможность избежать этого. Когда какой-то элемент базового класса не подходит для задач производного класса, этот элемент может быть соответствующим образом переопределен в производном классе. Может быть, наиболее захватывающей является идея наследования новыми классами существующих библиотек классов. Организации разрабатывают свои собственные библиотеки классов и могут при этом заимствовать достоинства различных распространенных в мире библиотек. В скором времени программное обеспечение будет конструироваться из стандартизованных повторно используемых компонентов точно так же, как сегодня конструируется аппаратное обеспечение. Это поможет ответить на будущие требования разработки все более мощного программного обеспечения. 9.2. Базовые классы и производные классы Часто объекты одного класса на самом деле являются также и объектами другого класса. Прямоугольник является также и четырехугольник (как и квадрат, и параллелограмм, и трапеция). Таким образом, можно сказать, что класс Rectangle (прямоугольник) является наследником класса Quadrilaterial (четырехугольник). В этом контексте класс Quadrilaterial является базовым классом, а класс Rectangle - производным классом. Прямоугольник является специальным типом четырехугольника, но неверно утверждать, что четырехугольник является прямоугольником. Па рис. 9.1 показано несколько простых примеров наследования. Другие объектно-ориентированные языки программирования, такие как Smalltalk, используют отличную от данной терминологию: в наследовании базовый класс называется суперклассом (представляет супермножество объектов), а производный класс называется подклассом (представляет подмножество объектов). Поскольку наследование обычно создает производный класс с большим количеством свойств, чем базовый класс, термины суперкласс и подкласс могут вызвать путаницу; мы будем избегать этих терминов. Наследование формирует древовидные иерархические структуры. Базовый класс находится в иерархических отношениях со своими производными
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |