Class TwoDimensionalShape : public Shape



План занятия 21

        

Наследование

Классы в объектно-ориентированных программах используются для моделирования концепций реального и программного мира. Концепции или сущности предметной области находятся в различных взаимоотношениях. Одно из таких взаимо отношений — отношение наследования (именуемое также отношением родитель-потомок или отношением обобщение–специализация или еще отношением является).

Наследование является формой утилизации(повторного использования) программного обеспечения, когда программист создает класс, ассимилирующий(вбирающий) данные и поведение существующего класса и обогащающий их добавлением новых свойств. Утилизация программного обеспечения экономит время, затрачиваемое на программную разработку. Оно также поощряет использование проверенного, отлаженного, высококачественного программного кода, позволяя  надеяться на то, что система будет реализована эффективно.

Традиционные библиотеки функций С позволяют многократно использовать в программах стандартные, предварительно скомпилированные функции, такие как strlen () и rand (). Многие поставщики разрабатывают специализированные библиотеки, которые расширяют стандартную библиотеку С. Например, можно приобрести библиотеки функций управления базами данных и функций управления изображением на экране. Однако с библиотеками функций связано ограничение: если поставщик не предоставляет исходный код для своих библиотек (а чаще всего это так), то вы не сможете расширить или изменить функции в соответствии со своими конкретными потребностями. Вместо этого приходится формировать программу так, чтобы подстроиться под библиотеку. Даже если поставщик передает исходный код, при его модификации можно непреднамеренно изменить другие части функции или отношения между функциями библиотеки.

Классы C++ обеспечивают более высокий уровень повторного использования кода. Многие поставщики сейчас предлагают библиотеки, которые состоят из объявлений и реализаций классов. Поскольку класс объединяет представление данных с методами, образуется более интегрированный пакет, чем библиотека функций. К примеру, единственный класс может предоставлять все средства для управления диалоговыми окнами. Часто для библиотек классов доступен исходный код, и каждый может модифицировать их в соответствии со своими потребностями. Однако в C++ для расширения и изменения классов имеется более удобный метод, чем правка кода. Этот способ - наследование классов — позволяет порождать новые классы от старых, называемых базовыми классами. Производный класс наследует все свойства, включая методы, старого класса. Унаследовать состояние обычно легче, чем построить его с нуля. Точно так же порождение класса с помощью наследования обычно проще разработки нового. Ниже перечислено, что позволяет делать наследование:

 

• Добавлять новые возможности в существующий класс. Например, в 

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

• Добавлять данные, которые представляет класс. Например, взяв за основу 

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

• Изменять поведение методов класса. Например, от класса Passenger, который представляет услуги, предоставляемые пассажиру авиалинии, можно породить класс First Class Passenger с более высоким уровнем обслуживания.

 

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

 

Базовые и производные классы

Очень часто объект некоторого класса является также и объектом другого класса. Прямоугольник — Rectangle, конечно же, является четырехугольником — Quadrilateral (как и квадрат, и параллелограмм, и трапеция). Таким образом, о классе Rectangle можно сказать, что он наследует классу Quadrilateral. В этом контексте класс Quadrilateral называется базовым, а класс Rectangle производным. Прямоугольник является специальным типом четырехугольника, но нельзя исходя из этого утверждать, что четырехугольник является прямоугольником, — он может быть, например, параллелограммом или другой фигурой.

 

 

Отношения наследования образуют древовидные иерархические структуры. Базовый класс находится в иерархическом отношении со своими 

производными классами. Хотя классы могут существовать независимо друг от друга, они, оказываясь в иерархических отношениях, становятся родственными друг другу. Класс становится либо базовым — предоставляя свои элементы другим классам, — либо производным — наследуя элементы других классов, — либо и тем, и другим.

 

Давайте разработаем простую иерархию наследования с пятью уровнями

Университетское сообщество насчитывает тысячи членов. Эти люди — сотрудники(Employee), учащиеся(Student) и бывшие выпускники университета (Alumni). Сотрудники относятся либо к профессорско-преподавательскому составу(Faculty), либо к вспомогательному персоналу(Stuff). Первые являются либо администраторами (такими, как деканы и члены ученых советов), либо преподавателями(Teacher). Заметьте, что некоторые администраторы могут преподавать, поэтому посредством сложного наследования мы образовали класс AdministratorTeacher. Заметьте также, что данная иерархия могла бы содержать много других классов. Например, учащиеся могут делиться на студентов и аспирантов. Студенты могут быть первокурсниками, второкурсниками, студентами младших курсов и старшекурсниками.

 

Каждая стрелка в иерархии представляет отношение «является». Следуя по стрелкам этой иерархии, мы можем, например, констатировать, что «Employee (сотрудник) является CommunityMember (членом сообщества), a Teacher (преподаватель) является членом Faculty (профессорско-преподавательского состава факультета). CommunityMember является непосредственным базовым классом для Employee, Student и Alumnus. Кроме

того, CommunityMember — косвенный базовый класс для всех остальных классов на диаграмме. Начиная снизу, читатель может пройти по стрелкам диаграммы и проследить отношение «является» до наивысшего базового класса. Так, AdministratorTeacher является Administrator, является членом Faculty, является Employee и является CommunityMember.

 

Рассмотрим теперь иерархию наследования Shape(геометрическая фигура). Иерархия начинается с базового класса Shape (фигура). От него производятся классы TwoDimensionalShape и ThreeDimensionalShape, — фигуры бывают либо двумерными, либо трехмерными. Третий уровень иерархии содержит некоторые более специфические типа двумерных и трехмерных фигур. Начиная снизу, можем пройти по стрелкам до наивысшего базового класса этой иерархии, идентифицируя отношения «является». Например, Triangle является TwoDimensionalShape и является Shape. Заметьте, что эта иерархия могла бы содержать многие другие классы, такие, как прямоугольники, эллипсы и трапеции, которые все являются двумерными фигурами.

Tetrahedron -тетраэдр, четырёхгранник

 

Спецификация того, что класс TwoDimensionalShape производится от (или наследует от) класса Shape, записывается в C++ следующим образом:

 

class TwoDimensionalShape : public Shape

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

С объектами базового класса и производного класса можно обращаться 

одинаковым образом; их общность выражается в элементах базового класса. 

Объекты всех классов, производных от общего базового класса, могут трактоваться как объекты базового класса (т.е. такие объекты находятся с базовым классом в отношении «является»).

 

 


Дата добавления: 2018-08-06; просмотров: 182; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!