Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Открытые, защищенные и закрытые базовые классы.



Наследование представляет собой механизм повторного использования программного обеспечения, в соответствии с кото­рым новые классы создаются на основе существующих. Эти классы наследуют свойства и поведение базовых классов и приобретают дополнительно новые, необходимые для новых классов, качества. Возможность повторного использо­вания программного обеспечения сберегает время, затраченное на его разработку, способствует повторному использованию апробированного и отлажен­ного высококачественного программного обеспечения и уменьшает число эксплутационных проблем, когда система начинает функционировать. Это сулит богатые возможности. Полиморфизм позволяет нам писать программы в об­щем виде для обработки большого разнообразия существующих и определяе­мых в дальнейшем логически связанных классов. Наследование и полимор­физм представляют собой эффективные методики для разработки сложных программных систем.

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

Каждый объект производного класса является также объектом базового класса, из которого получен этот производный класс. Однако противополож­ное неверно - объекты базового класса не являются объектами производных классов базового объекта. Мы воспользуемся этим отношением - «объект производного класса является объектом базового класса», чтобы выполнять некоторые интересные преобразования. Например, мы можем перечислить много разных объектов, связанных отношением наследования, в связанном списке объектов базового класса. Это позволит обрабатывать разные объекты одним общим образом. Как мы в дальнейшем увидим в этой и следующей гла­вах, это является одним из важнейших методов объектно-ориентированного программирования.

Мы введем в этой лекции новое средство для управления доступом к элемен­ту - речь идет о защищенном доступе. Производные и дружественные им классы имеют право доступа к защищенным элементам базового класса; у остальных функций такого права нет.

Опыт построения программных систем показывает, что большие части программы имеют дело с тесно связанными специальными случаями. В таких системах трудно увидеть «целую картину», потому что проектировщик и про­граммист заняты своими частностями. Объектно-ориентированное програм­мирование предоставляет некоторые средства для того, чтобы «за деревьями видеть лес». Один такой процесс, позволяющий «видеть лес», называют ино­гда абстракцией.

Мы делаем различие между отношениями «является» и «имеет». Первое относится к наследованию. В отношении «является» объект типа производного класса можно обрабатывать как объект типа базового класса. Отношение «име­ет» представляет композицию. В отношении «имеет» объект клас­са содержит один или несколько объектов других классов в качестве элементов.

Производный класс не может иметь доступа к закрытым элементам своего базового класса; такой доступ нарушал бы инкапсуляцию последнего. Однако производный класс может иметь доступ к открытым и защищенным элемен­там базового класса. Элементы базового класса, доступ к которым не разрешен для производного класса через отношение наследования, должны быть объяв­лены в базовом классе как закрытые. Производный класс может иметь доступ к закрытым элементам базового класса только через специальные функции доступа, предоставляемые открытым интерфейсом базового класса.

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

Наиболее замечательна сама идея, что новые классы могут наследовать от существующих библиотек классов. Организации разрабатывают свои собст­венные библиотеки классов, а могут использовать другие библиотеки, доступ­ные во всем мире. Есть точка зрения, что когда-нибудь программное обеспече­ние будут создавать из стандартизованных повторно используемых компонентов точно так же, как сегодня часто собирают аппаратуру. Это помо­жет удовлетворить требования по разработке еще более мощного программно­го обеспечения, которое нам понадобится в будущем.

Часто объект одного класса «является» также и объектом другого класса. Прямоугольник - rectangle, конечно же, является четырехугольником - quadrilateral (как являются и квадрат, и параллелограмм, и трапеция). Таким образом, о классе Rectangle можно сказать, что он наследует классу Quadrila­teral. В этом смысле класс Quadrilateral называется базовым, а класс Rectan­gle называется производным. Прямоугольник является специальным типом четырехугольника, но нельзя исходя из этого утверждать, что четырехуголь­ник является прямоугольником. Другие языки объектно-ориентированного программирования, такие, как Smalltalk, используют другую терминологию: в отношении наследования базо­вый класс называется надклассом, а производный класс - подклассом. По­скольку наследование обычно образует производные классы «больше» базо­вых, термины «надкласс» и «подкласс», по-видимому, не очень удачны; мы будем избегать их применения.

Наследование приводит к древовидным иерархическим структурам. Базо­вый класс находится в иерархическом отношении со своими производными классами. Один класс, конечно, может существовать сам по себе, но когда класс включается в механизм наследования, он становится либо базовым классом, который определяет свойства и поведение других классов, либо про­изводным классом, который наследует чьи-то свойства и поведение.

Построим один простой пример иерархии наследования. В ти­пичном университетском сообществе тысячи людей, которые являются его членами (CommunityMember). Эти люди - сотрудники (Employee) и студенты (Student). Сотрудники относятся либо к профессорско-преподавательскому со­ставу - сотрудники факультетов (Faculty), - либо к вспомогательному пер­соналу (Staff). Факультетские сотрудники являются либо администраторами (Administrator), либо преподавателями (Teacher). Это дает иерархию наследо­вания.

Для того, чтобы указать, что класс CommissionWorker получается из класса Employee, класс CommissionWorker обычно определяется следующим образом:

 

class CommissionWorker: public Employee

{

…………………………………………….

};

Это пример открытого наследования. Вероятно, вам часто придется им пользоваться. Мы также будем говорить о защищенном и закрытом насле­довании.

В случае открытого наследования открытые и защищенные элементы базового класса наследуются в качестве открытых и защищенных элемен­тов производным классом.

Можно рассматривать объекты базового класса и объекты производного класса аналогичным образом. Общность выражается в атрибутах и поведении базового класса. Объекты любых открыто-производных классов общего базо­вого класса можно рассматривать как объекты этого базового класса.


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-04-10; Просмотров: 969; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.013 с.)
Главная | Случайная страница | Обратная связь