Файл: 7. Взаимодействие классов на основе наследования.pdf

Добавлен: 20.10.2018

Просмотров: 1234

Скачиваний: 15

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

 

7. Взаимодействие классов на основе наследования

 

Вторым  важнейшим  способом  взаимодействия  классов  является 

обобщение, при котором один из классов описывает некоторое достаточно 

общее  понятие,  а  другие  –  более  конкретные  разновидности  этого 

понятия.  Тем  самым  появляется  возможность  моделировать  связи  типа 

«Общее – частное». Это позволяет проводить классификацию понятий. 

Аналогично  принципу  агрегации/композиции,  далеко  не  все  классы 

можно  связывать  подобным  образом.  Вот  некоторые  примеры  общих 

понятий и их более конкретных разновидностей

1. Общее понятие: компьютер 

разновидности: стационарные компьютеры, мобильные компьютеры 

 

разновидности мобильных компьютеров: ноутбуки, нетбуки, 

 

       планшетные компьютеры 

     разновидности стационарных: настольный компьютер, сервер,  

             суперкомпьютер 

2. Общее понятие: графическая фигура 

        разновидности: окружность, отрезок, прямоугольник 

3. Общее понятие: структура данных 

        разновидности: список, деревохеш-таблица 

 

разновидности списка: упорядоченный, двунаправленный 

 

разновидности дерева: двоичное, поисковое, недвоичное 

4. Общее понятие: транспортное средство (ТС) 

        разновидности ТС: наземное, воздушное, водное 

 

разновидности наземного ТС : автомобиль, трактор, трамвай и др. 

 

      разновидности автомобилей: грузовые, легковые, спортивные 

 

разновидности воздушного ТС: самолет, вертолет, воздушный шар 

5. Общее понятие: человек 

       разновидности: учащийся, сотрудникпациентклиент 

 

разновидности учащихсяшкольник, студенткурсант 

 


background image

 

 

На  основе  этих  примеров,  а  также  исходя  из  здравого  смысла,  можно 

сформулировать    следующее  правило  для  выяснения  возможности 

установления отношения обобщения между некоторыми классами: 

класс В описывает понятие, которое является частным случаем 

понятия, описываемого классом А 

 

В  англоязычной  литературе  этот  тип  взаимодействия  кратко 

определяется как “is-a” (является, есть).  

С  другой  стороны,  можно  привести  множество  примеров  классов, 

между  которыми  данное  отношение  устанавливать  не  следует.  Например 

класс  Стол  и  класс  Стул  напрямую  связать  нельзя,  но  косвенно  можно  – 

через общее для них понятие Мебель. 

В  объектных  языках  программирования  отношение  обобщения 

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

является  одним  из  фундаментальных  отличий  объектных  языков  от  не-

объектных.  Очень  многие  мощные  возможности  объектных  языков  (в 

частности, 

рассматриваемый 

далее 

полиморфизм) 

основаны 

на 

использовании наследования. 

Суть  механизма  наследования  состоит  в  следующем.  Пусть  имеется 

некоторый класс со своими свойствами и методами. На основе этого класса 

можно  создать  новый  класс,  связав  его  с  исходным  классом  отношением 

наследования.  Исходный  класс  называют  родительским  или  базовым 

(parent class), а производный от него  – дочерним или классом-наследником 

(child class). 

Отношение наследования между двумя классами означает,  

что в дочернем классе можно использовать свойства и методы базового 

родительского класса БЕЗ их определения!  

Эти свойства и методы просто наследуются из родительского класса.

 

 


background image

 

 

При создании дочернего класса в него надо добавить новые свойства и 

методы, которых не было в родительском классе. Тем самым дочерний класс 

расширяет, дополняет набор свойств и методов своего родителя и именно 

поэтому описывает более конкретное понятие. Например, класс «Человек» 

может включать такие «общечеловеческие» данные как фамилия и имя, дата 

рождения,  пол  и  т.д.  К  этим  данным  в  классе  «Студент»  могут  быть 

добавлены  такие  специфические  данные  как  специальность    и  форма 

обучения, полученные оценки, шифр группы и др. 

На  основе  одного  базового  класса  можно  создать  любое  разумное 

количество  дочерних  классов.  У  всех  дочерних  классов  есть  что-то  общее, 

определяемое  унаследованными  свойствами  и  методами,  и  в  то  же  время 

каждый класс индивидуален, так как содержит свои собственные свойства 

и методы.  

Дополнительно  в  дочерних  классах  можно  выполнить  так  называемое 

переопределение некоторых унаследованных методов. Этот очень мощный, 

но сложный для понимания механизм связан с принципом полиморфизма и 

рассматривается далее в разделе 11. 

Схематично взаимодействие базового класса и созданных на его основе 

производных классов показано на следующем рисунке.

 

 

 

 

 

 

 

 

 

 

Мощь механизма наследования заключается в том, что дочерний класс, 

в свою очередь, может выступать в качестве базового родительского класса, 

    Базовый класс 

  

  свойства 
  методы 

 

 унаследованные свойства 
 унаследованные методы 
 новые свойства класса 1 
 новые методы класса 1 
 переопределенные методы 

   дочерний  класс 1 

  

 

 унаследованные свойства 
 унаследованные методы 
 новые свойства класса 2 
 новые методы класса 2 
 переопределенные методы 

   дочерний класс 2 

  

 

в дочерних классах 

не определяются 


background image

 

 

на основе которого можно создать свои дочерние классы. В итоге возникает 

многоуровневая  иерархическая  структура  классов.  На  верхних  уровнях 

этой  иерархии  находятся  наиболее  общие  классы  с  относительно 

небольшим  числом  свойств  и  методов.  Чем  ниже  класс  в  иерархии,  тем 

больше он имеет свойств и методов и, тем самым, носит более конкретный 

характер.    Необходимо  четко  понимать,  что  каждый  нижележащий  класс 

наследует  свойства    и  методы  от  всех  своих  потомков,  начиная  с  самого 

верхнего  уровня.  Это  позволяет  создавать  мощные  по  своим  функциям 

классы путем постепенного наращивания возможностей. 

Классы  верхних  уровней  часто  объявляются  абстрактными.  Эти 

классы нужны для придания общности нижележащим подклассам.  

Различают два типа наследования – простое и множественное: 

  простое  (единичное):  дочерний  класс  может  иметь  только  одного 

родителя 

  множественное: родителей может быть несколько 

Очевидно, что множественное наследование дает больше возможностей 

при  создании  дочерних  классов,  поскольку  можно  наследовать  свойства  и 

методы  сразу  от  нескольких  классов.  Первоначально  множественное 

наследование  было  реализовано  в  языке  С++,  но  в  более  поздних  языках 

(Java,  C#,  Delphi/Free  Pascal))  от  него  отказались,  оставив  только  простое 

наследование.  Это  связано  с  тем,  что  как  показала  многолетняя  практика 

использования  языка  С++,  множественное  наследование  часто  приводит  к 

ряду  проблем.  Поэтому  разработчики  более  поздних  языков  отказались  от 

множественного  наследования  в  чистом  (как  в  С++)  виде,  но  ввели 

некоторую  частичную  замену  этого  механизма  на  уровне  так  называемых 

интерфейсных классов.  

Необходимо отметить, что есть современные языки, где множественное 

наследование  реализовано  в  классическом  виде  (например  -  Python,  Eiffel

Perl).  В  дальнейшем  основное  внимание  будет  уделено  использованию 

механизма простого наследования. 


background image

 

 

Нетрудно  догадаться,  что  в  случае  простого  наследования  (родитель 

один!) иерархия классов  имеет  древовидный  разветвляющийся  характер, 

что  конечно  же  проще  чем  структура  в  виде  ориентированного  графа

которая возникает в случае множественного наследования. 

 

 

 

 

 

 

 

 

 

 

 

Общесетевая иерархия классов (множественное наследование):

 

 

 

 

 

 

 

 

 

Все  стандартные  библиотеки  классов,  поддерживающие  языки  Java, 

платформу .NET и Delphi/FP построены на основе простого наследования и 

имеют  древовидную  структуру.  В  этих  библиотеках  на  самом  верхнем 

уровне находится единственный корневой класс, который является общим 

предком  абсолютно  любых  классов,  как  стандартных,  так  и  создаваемых 

программистом  при  разработке  объектной  программы.  В  этом  классе 

Базовый класс верхнего уровня 

дочерний класс 1 уровня 1 

дочерний класс 2 уровня 1 

класс 1 

уровня 2 

класс 2 

уровня 2 

класс 3 

уровня 2 

класс 4 

уровня 2 

Базовый класс верхнего уровня 

Базовый класс верхнего уровня 

Подкласс 1 уровня 1 

Подкласс 2 уровня 1 

Подкласс 3 уровня 1 

Подкласс 1 

уровня 2 

Подкласс 2 

уровня 2 

Подкласс 3 

уровня 2 

Подкласс 4 

уровня 2