"Информатика (базовый и углублённый уровни) (в 2 частях)", Поляков К.Ю., Еремин Е.А.
Иерархия классов показывает, как классы связаны наследованием: класс-потомок получает свойства и методы класса-предка. Благодаря этому общую часть можно описать один раз, а в дочерних классах добавлять особенности или менять поведение отдельных методов. Наследование удобно, когда объекты относятся к одному общему типу, но отличаются деталями. Главное — различать направление связи: потомок наследует возможности предка, а при вызове метода учитывается класс конкретного объекта.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Класс-предок (родительский класс) — класс, от которого другой класс получает свойства и методы. Он нужен, чтобы собрать в одном месте общие характеристики объектов, например общие действия для разных видов транспорта. Благодаря этому одинаковый код не приходится повторять в каждом специализированном классе.
Класс-потомок (дочерний класс) — класс, объявленный на основе другого класса и наследующий его свойства и методы. Потомок нужен, когда объектам требуется общая основа, но отдельным видам нужны собственные особенности. Например, автомобиль может иметь характеристики любого транспорта и дополнительно хранить число дверей.
Наследование — механизм создания класса на основе другого класса с получением и возможным изменением его возможностей. Оно позволяет переносить общие свойства и методы в предка, а затем использовать их в потомках. Так программа становится проще для расширения: новый вид объекта можно описать через уже существующий общий класс.
Иерархия классов — расположение классов в отношениях «предок — потомок», показывающее, какие классы наследуют возможности других. Её можно представить деревом: общий класс находится выше, а более конкретные — ниже. Такая схема помогает увидеть связи между типами объектов и понять, откуда потомок получает возможности.
Классы объединяют в иерархию, когда у нескольких видов объектов есть общие свойства и действия. Если записать общую часть отдельно в каждом классе, изменения придётся повторять, а разные реализации могут начать расходиться. Поэтому общие атрибуты и методы помещают в класс-предок, а потомков используют для описания различий. Например, класс «Транспорт» может хранить скорость и метод движения, а «Автомобиль» — дополнять их своими характеристиками.
При объявлении потомка указывают, от какого класса он наследуется; конкретная запись зависит от языка программирования. Смысл связи остаётся одним: потомок получает возможности предка и может на них опираться. Для наглядности классы изображают схемой или деревом, где ветвь ведёт от общего класса к более конкретному. Если от «Транспорта» наследуются «Автомобиль» и «Самолёт», это показывает общий источник их возможностей, но не означает, что один из них является разновидностью другого.
Объект потомка получает доступ к унаследованным атрибутам и методам, даже если их объявления нет в коде самого потомка. Причина в том, что класс потомка связан с предком, а механизм наследования учитывает эту связь при работе с объектом. Поэтому не нужно копировать в «Автомобиль» метод движения, если он уже определён в «Транспорте». Потомок может использовать его наряду со своими собственными возможностями.
Потомок не обязан ограничиваться тем, что получил от предка: он может добавить собственные атрибуты и методы. Кроме того, он может переопределить унаследованный метод, то есть задать для него новую реализацию. Это нужно, если общее действие у разных видов объектов выполняется по-разному: формула площади зависит от вида фигуры. При этом новая реализация относится к потомку, а не переписывает метод в предке.
Когда программа вызывает метод объекта, сначала она ищет его в классе, к которому относится объект. Если метода там нет, поиск продолжается в классах-предках по цепочке наследования. Такой порядок позволяет потомку иметь собственную версию метода и при этом пользоваться унаследованными. Поэтому для объекта «Круг» будет найдена реализация в «Круге», если она там задана, а для объекта «Прямоугольник» — соответствующая версия в его классе.
| Характеристика | Класс-предок | Класс-потомок |
|---|---|---|
| Место в иерархии | Находится выше одного или нескольких потомков | Находится ниже предка |
| Какие свойства и методы содержит | Общие для связанных классов | Унаследованные и собственные |
| Что получает при наследовании | Не получает возможности от потомка | Доступные свойства и методы предка |
| Как может изменять поведение | Определяет общую реализацию | Добавляет возможности или переопределяет методы |
| Пример связи между классами | «Транспорт» | «Автомобиль» |
Сравнивайте классы по строкам: так легче увидеть направление наследования и различить общую часть с особенностями потомка. Если класс получает возможности другого класса, именно он является потомком. Таблица также помогает проверить, не перепутано ли наследование с простым использованием объекта другого типа.
Задача 1. Даны классы «Транспорт» и «Автомобиль». Укажите, какой класс может быть предком, а какой — потомком, и изобразите связь между ними.
Ответ: «Транспорт» → «Автомобиль». Стрелка показывает, что автомобиль наследует возможности транспорта.
Задача 2. Класс «Фигура» содержит метод для вычисления периметра, а класс «Прямоугольник» наследуется от него. Определите, какие методы доступны объекту прямоугольника, если в самом классе «Прямоугольник» они не объявлены.
Ответ: объекту доступен метод вычисления периметра из класса «Фигура». Другие методы также будут доступны, если они объявлены в классе-предке или выше по цепочке наследования.
Задача 3. Класс «Фигура» задаёт метод площади, а классы «Прямоугольник» и «Круг» наследуются от него и по-разному реализуют этот метод. Определите, какой метод будет вызван для объекта каждого класса.
Ответ: прямоугольник использует реализацию площади из класса «Прямоугольник», а круг — из класса «Круг». Переопределение позволяет каждому виду фигуры вычислять площадь по своей формуле.
Путать предка и потомка — значит считать, что наследует возможности предок. Обычно ошибка возникает из-за того, что названия описывают родственные роли, а направление связи неочевидно. Проверь себя вопросом: «Какой класс получает свойства и методы другого?» Получающий их класс и есть потомок.
Некоторые считают, что объект может вызывать только методы, записанные непосредственно в его классе. Так происходит, если забыть, что связь наследования расширяет доступные потомку возможности. Чтобы проверить себя, проследи цепочку от класса объекта к предкам и найди, где объявлен метод. Если он доступен и найден в этой цепочке, потомок может его использовать.
Переопределение в потомке иногда принимают за изменение метода предка. Причина ошибки — у методов одинаковое имя, хотя реализации принадлежат разным классам. Проверь, какой объект вызывает метод: экземпляр потомка использует его версию, а экземпляр предка — свою. Значит, само переопределение не меняет исходную реализацию родительского класса.
Наличие объекта одного класса внутри другого не создаёт наследование. Это может быть просто поле, которое хранит объект и помогает классу выполнять свою задачу. Ошибку легко обнаружить, спросив, является ли объект одного класса разновидностью другого. Если нет, а один объект лишь содержит другой, это связь использования, а не отношение «предок — потомок».
Для изучения наследования нужно уметь объявлять классы, создавать объекты и вызывать их методы. Также важно различать класс как описание объектов и экземпляр как конкретный объект, созданный по этому описанию. Атрибуты и методы составляют возможности объекта, а наследование объясняет, как часть этих возможностей приходит из другого класса. Иерархии помогают проектировать программы с общими и специализированными типами и служат основой для дальнейшего изучения полиморфизма.
Чем класс-предок отличается от класса-потомка?
Класс-предок содержит свойства и методы, которые могут наследовать другие классы. Класс-потомок строится на его основе, получает эти возможности и может дополнять или изменять их.
Может ли объект потомка вызывать метод, которого нет в его классе?
Да, если метод объявлен в одном из классов-предков и доступен потомку. При поиске метода программа проверит класс объекта, а затем его предков.
Зачем переопределять унаследованный метод?
Переопределение позволяет сохранить общий интерфейс, но задать подходящую конкретному классу реализацию. Например, фигуры могут по-разному вычислять площадь.
Изменится ли метод предка, если его переопределить в потомке?
Нет, переопределение создаёт или задаёт отдельную реализацию в классе-потомке. Объекты самого предка продолжают использовать его исходный метод.
Как понять, является ли отношение между классами наследованием?
Проверьте, можно ли сказать, что объект одного класса является разновидностью другого: автомобиль — это транспорт. Если класс лишь хранит объект другого класса, это само по себе не наследование.
§ 50. Иерархия классов