На Горох
Информатика, 11 класс

§ 50. Иерархия классов

"Информатика (базовый и углублённый уровни) (в 2 частях)", Поляков К.Ю., Еремин Е.А.

Объяснение темы В оглавлении: § 50. Иерархия классов

Кратко о теме

Иерархия классов показывает, как классы связаны наследованием: класс-потомок получает свойства и методы класса-предка. Благодаря этому общую часть можно описать один раз, а в дочерних классах добавлять особенности или менять поведение отдельных методов. Наследование удобно, когда объекты относятся к одному общему типу, но отличаются деталями. Главное — различать направление связи: потомок наследует возможности предка, а при вызове метода учитывается класс конкретного объекта.

Объяснение темы

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

Определения и обозначения

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

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

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

Иерархия классов — расположение классов в отношениях «предок — потомок», показывающее, какие классы наследуют возможности других. Её можно представить деревом: общий класс находится выше, а более конкретные — ниже. Такая схема помогает увидеть связи между типами объектов и понять, откуда потомок получает возможности.

Как это устроено

Классы объединяют в иерархию, когда у нескольких видов объектов есть общие свойства и действия. Если записать общую часть отдельно в каждом классе, изменения придётся повторять, а разные реализации могут начать расходиться. Поэтому общие атрибуты и методы помещают в класс-предок, а потомков используют для описания различий. Например, класс «Транспорт» может хранить скорость и метод движения, а «Автомобиль» — дополнять их своими характеристиками.

При объявлении потомка указывают, от какого класса он наследуется; конкретная запись зависит от языка программирования. Смысл связи остаётся одним: потомок получает возможности предка и может на них опираться. Для наглядности классы изображают схемой или деревом, где ветвь ведёт от общего класса к более конкретному. Если от «Транспорта» наследуются «Автомобиль» и «Самолёт», это показывает общий источник их возможностей, но не означает, что один из них является разновидностью другого.

Объект потомка получает доступ к унаследованным атрибутам и методам, даже если их объявления нет в коде самого потомка. Причина в том, что класс потомка связан с предком, а механизм наследования учитывает эту связь при работе с объектом. Поэтому не нужно копировать в «Автомобиль» метод движения, если он уже определён в «Транспорте». Потомок может использовать его наряду со своими собственными возможностями.

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

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

Классы в иерархии наследования

ХарактеристикаКласс-предокКласс-потомок
Место в иерархииНаходится выше одного или нескольких потомковНаходится ниже предка
Какие свойства и методы содержитОбщие для связанных классовУнаследованные и собственные
Что получает при наследованииНе получает возможности от потомкаДоступные свойства и методы предка
Как может изменять поведениеОпределяет общую реализациюДобавляет возможности или переопределяет методы
Пример связи между классами«Транспорт»«Автомобиль»

Сравнивайте классы по строкам: так легче увидеть направление наследования и различить общую часть с особенностями потомка. Если класс получает возможности другого класса, именно он является потомком. Таблица также помогает проверить, не перепутано ли наследование с простым использованием объекта другого типа.

Разбор задач

Задача 1. Даны классы «Транспорт» и «Автомобиль». Укажите, какой класс может быть предком, а какой — потомком, и изобразите связь между ними.

  1. Проверяем смысл связи: автомобиль является разновидностью транспорта, но транспорт не обязательно является автомобилем. Значит, общий тип — «Транспорт», а более конкретный — «Автомобиль». В наследовании более конкретный класс строится на основе общего.
  2. Назначаем роли: «Транспорт» — класс-предок, «Автомобиль» — класс-потомок. Потомок может унаследовать общие свойства и методы, например скорость или действие «двигаться», и дополнить их своими. Для схемы проведём связь от предка к потомку.

Ответ: «Транспорт» → «Автомобиль». Стрелка показывает, что автомобиль наследует возможности транспорта.

Задача 2. Класс «Фигура» содержит метод для вычисления периметра, а класс «Прямоугольник» наследуется от него. Определите, какие методы доступны объекту прямоугольника, если в самом классе «Прямоугольник» они не объявлены.

  1. Сначала смотрим, есть ли нужный метод в классе объекта — «Прямоугольник». По условию там он не объявлен, поэтому поиск не заканчивается. Само отсутствие записи в потомке ещё не означает, что объект не может выполнить действие.
  2. Переходим к классу-предку «Фигура». В нём задан метод вычисления периметра, и он доступен объекту потомка по наследованию. Значит, объект прямоугольника может вызвать этот унаследованный метод.

Ответ: объекту доступен метод вычисления периметра из класса «Фигура». Другие методы также будут доступны, если они объявлены в классе-предке или выше по цепочке наследования.

Задача 3. Класс «Фигура» задаёт метод площади, а классы «Прямоугольник» и «Круг» наследуются от него и по-разному реализуют этот метод. Определите, какой метод будет вызван для объекта каждого класса.

  1. Уточняем, где находится реализация метода для каждого объекта. По условию оба дочерних класса переопределили метод площади, поэтому в каждом из них есть собственная версия. Общая версия в «Фигуре» не будет выбрана первой для этих объектов.
  2. Применяем порядок поиска: сначала проверяется класс конкретного объекта. Для объекта «Прямоугольник» находится метод в классе «Прямоугольник», а для объекта «Круг» — метод в классе «Круг». Если бы в одном из классов метода не было, поиск продолжился бы в «Фигуре».

Ответ: прямоугольник использует реализацию площади из класса «Прямоугольник», а круг — из класса «Круг». Переопределение позволяет каждому виду фигуры вычислять площадь по своей формуле.

Типичные ошибки

Путать предка и потомка — значит считать, что наследует возможности предок. Обычно ошибка возникает из-за того, что названия описывают родственные роли, а направление связи неочевидно. Проверь себя вопросом: «Какой класс получает свойства и методы другого?» Получающий их класс и есть потомок.

Некоторые считают, что объект может вызывать только методы, записанные непосредственно в его классе. Так происходит, если забыть, что связь наследования расширяет доступные потомку возможности. Чтобы проверить себя, проследи цепочку от класса объекта к предкам и найди, где объявлен метод. Если он доступен и найден в этой цепочке, потомок может его использовать.

Переопределение в потомке иногда принимают за изменение метода предка. Причина ошибки — у методов одинаковое имя, хотя реализации принадлежат разным классам. Проверь, какой объект вызывает метод: экземпляр потомка использует его версию, а экземпляр предка — свою. Значит, само переопределение не меняет исходную реализацию родительского класса.

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

Связь с другими темами

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

Что запомнить

  • Потомок наследует свойства и методы предка.
  • Иерархию классов можно представить в виде дерева.
  • Потомок может дополнять возможности предка.
  • Потомок может переопределить унаследованный метод.
  • При вызове метода учитывается класс конкретного объекта.
  • Наследование выражает отношение «является разновидностью».

Частые вопросы по теме

Чем класс-предок отличается от класса-потомка?

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

Может ли объект потомка вызывать метод, которого нет в его классе?

Да, если метод объявлен в одном из классов-предков и доступен потомку. При поиске метода программа проверит класс объекта, а затем его предков.

Зачем переопределять унаследованный метод?

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

Изменится ли метод предка, если его переопределить в потомке?

Нет, переопределение создаёт или задаёт отдельную реализацию в классе-потомке. Объекты самого предка продолжают использовать его исходный метод.

Как понять, является ли отношение между классами наследованием?

Проверьте, можно ли сказать, что объект одного класса является разновидностью другого: автомобиль — это транспорт. Если класс лишь хранит объект другого класса, это само по себе не наследование.

Спросить по теме параграфа

§ 50. Иерархия классов

Эта же тема в других учебниках

Учебник

Оглавление →
Предмет
Информатика
Класс
11 класс
Учебник
"Информатика (базовый и углублённый уровни) (в 2 частях)", Поляков К.Ю., Еремин Е.А.