Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Открытые, защищенные и закрытые базовые классы.
Наследование представляет собой механизм повторного использования программного обеспечения, в соответствии с которым новые классы создаются на основе существующих. Эти классы наследуют свойства и поведение базовых классов и приобретают дополнительно новые, необходимые для новых классов, качества. Возможность повторного использования программного обеспечения сберегает время, затраченное на его разработку, способствует повторному использованию апробированного и отлаженного высококачественного программного обеспечения и уменьшает число эксплутационных проблем, когда система начинает функционировать. Это сулит богатые возможности. Полиморфизм позволяет нам писать программы в общем виде для обработки большого разнообразия существующих и определяемых в дальнейшем логически связанных классов. Наследование и полиморфизм представляют собой эффективные методики для разработки сложных программных систем. При создании нового класса вместо того, чтобы писать совершенно новые элементы данных и функции-элементы, программист может просто указать, что новый класс должен наследовать элементы ранее определенного базового класса. Этот новый класс называется производным классом. Каждый производный класс, в свою очередь, может быть базовым для каких-то будущих производных классов. При простом наследовании производный класс получается на основе только одного базового класса. При сложном наследовании производный класс наследует свойства от многих (возможно, логически не связанных) классов. Новый класс, как правило, вводит свои элементы данных и функции, поэтому производный класс, вообще говоря, «больше» исходного базового класса. Новый производный класс имеет больше специфических свойств в сравнении с исходным базовым и представляет меньшую группу объектов. В случае простого наследования производный класс в своей основе остается по существу таким же, как базовый класс. Настоящая сила наследования определяется возможностью добавлять, замещать и уточнять наследуемые от базовых классов свойства. Каждый объект производного класса является также объектом базового класса, из которого получен этот производный класс. Однако противоположное неверно - объекты базового класса не являются объектами производных классов базового объекта. Мы воспользуемся этим отношением - «объект производного класса является объектом базового класса», чтобы выполнять некоторые интересные преобразования. Например, мы можем перечислить много разных объектов, связанных отношением наследования, в связанном списке объектов базового класса. Это позволит обрабатывать разные объекты одним общим образом. Как мы в дальнейшем увидим в этой и следующей главах, это является одним из важнейших методов объектно-ориентированного программирования. Мы введем в этой лекции новое средство для управления доступом к элементу - речь идет о защищенном доступе. Производные и дружественные им классы имеют право доступа к защищенным элементам базового класса; у остальных функций такого права нет. Опыт построения программных систем показывает, что большие части программы имеют дело с тесно связанными специальными случаями. В таких системах трудно увидеть «целую картину», потому что проектировщик и программист заняты своими частностями. Объектно-ориентированное программирование предоставляет некоторые средства для того, чтобы «за деревьями видеть лес». Один такой процесс, позволяющий «видеть лес», называют иногда абстракцией. Мы делаем различие между отношениями «является» и «имеет». Первое относится к наследованию. В отношении «является» объект типа производного класса можно обрабатывать как объект типа базового класса. Отношение «имеет» представляет композицию. В отношении «имеет» объект класса содержит один или несколько объектов других классов в качестве элементов. Производный класс не может иметь доступа к закрытым элементам своего базового класса; такой доступ нарушал бы инкапсуляцию последнего. Однако производный класс может иметь доступ к открытым и защищенным элементам базового класса. Элементы базового класса, доступ к которым не разрешен для производного класса через отношение наследования, должны быть объявлены в базовом классе как закрытые. Производный класс может иметь доступ к закрытым элементам базового класса только через специальные функции доступа, предоставляемые открытым интерфейсом базового класса. Одна проблема с наследованием заключается в том, что производный класс может наследовать открытые функции-элементы, которые не нужно или не следовало бы иметь в «потомстве» явно. Если какой-нибудь элемент базового класса не подходит для производного класса, этот элемент может быть переопределен в самом производном классе с соответствующей реализацией. Наиболее замечательна сама идея, что новые классы могут наследовать от существующих библиотек классов. Организации разрабатывают свои собственные библиотеки классов, а могут использовать другие библиотеки, доступные во всем мире. Есть точка зрения, что когда-нибудь программное обеспечение будут создавать из стандартизованных повторно используемых компонентов точно так же, как сегодня часто собирают аппаратуру. Это поможет удовлетворить требования по разработке еще более мощного программного обеспечения, которое нам понадобится в будущем. Часто объект одного класса «является» также и объектом другого класса. Прямоугольник - rectangle, конечно же, является четырехугольником - quadrilateral (как являются и квадрат, и параллелограмм, и трапеция). Таким образом, о классе Rectangle можно сказать, что он наследует классу Quadrilateral. В этом смысле класс Quadrilateral называется базовым, а класс Rectangle называется производным. Прямоугольник является специальным типом четырехугольника, но нельзя исходя из этого утверждать, что четырехугольник является прямоугольником. Другие языки объектно-ориентированного программирования, такие, как Smalltalk, используют другую терминологию: в отношении наследования базовый класс называется надклассом, а производный класс - подклассом. Поскольку наследование обычно образует производные классы «больше» базовых, термины «надкласс» и «подкласс», по-видимому, не очень удачны; мы будем избегать их применения. Наследование приводит к древовидным иерархическим структурам. Базовый класс находится в иерархическом отношении со своими производными классами. Один класс, конечно, может существовать сам по себе, но когда класс включается в механизм наследования, он становится либо базовым классом, который определяет свойства и поведение других классов, либо производным классом, который наследует чьи-то свойства и поведение. Построим один простой пример иерархии наследования. В типичном университетском сообществе тысячи людей, которые являются его членами (CommunityMember). Эти люди - сотрудники (Employee) и студенты (Student). Сотрудники относятся либо к профессорско-преподавательскому составу - сотрудники факультетов (Faculty), - либо к вспомогательному персоналу (Staff). Факультетские сотрудники являются либо администраторами (Administrator), либо преподавателями (Teacher). Это дает иерархию наследования. Для того, чтобы указать, что класс CommissionWorker получается из класса Employee, класс CommissionWorker обычно определяется следующим образом:
class CommissionWorker: public Employee { ……………………………………………. }; Это пример открытого наследования. Вероятно, вам часто придется им пользоваться. Мы также будем говорить о защищенном и закрытом наследовании. В случае открытого наследования открытые и защищенные элементы базового класса наследуются в качестве открытых и защищенных элементов производным классом. Можно рассматривать объекты базового класса и объекты производного класса аналогичным образом. Общность выражается в атрибутах и поведении базового класса. Объекты любых открыто-производных классов общего базового класса можно рассматривать как объекты этого базового класса. Популярное:
|
Последнее изменение этой страницы: 2016-04-10; Просмотров: 969; Нарушение авторского права страницы