Найти в Дзене
ZDG

Введение в ООП. Часть 4: Наследование

Предыдущие части:

Научившись делать классы, ленивый программист входит во вкус. Разрабатывая свою воображаемую игру "игрок против монстров", он уже создал класс монстров, обладающий некоторыми нужными свойствами, такими как здоровье, сила и броня, а также метод move() для перемещения:

Добавим-ка в класс Monster ещё один метод. Пусть монстр может трусливо убежать с поля боя, например. Назовем его escape().

Теперь можно заняться игроком. У него тоже есть здоровье, сила и броня, но кроме того, у него есть ещё количество патронов (ammo). Он также может перемещаться, но убегать для него не предусмотрено. Зато у него есть метод, чтобы поймать монстра живьем. Назовем его catch().

Ну вот, создано два класса: Player и Monster.

Ленивый программист смотрит на это дело и начинает ныть: У игрока и у монстра есть одинаковые свойства: hp, strength, armor, а также одинаковый метод move(). Почему я должен писать одно и то же два раза? Вот бы сделать игрока и монстра одного класса. Но если просто соединить вместе и свойства, и методы обоих классов в общий класс, то получится, что у объектов-монстров будет лишнее свойство ammo и лишний метод catch(), а у объекта-игрока будет лишний метод escape(). Можно ли так делать? Да запросто. Но это повышает путаницу, и вообще непорядок.

Давайте сначала выделим всё, что есть общее у игрока и у монстра, в отдельный класс. Назовем его... ну, пусть будет Unit.

Теперь, если бы можно было взять этот класс, "нарастить" его и получить другой класс, было бы круто. Так ведь, оказывается, можно! Получаем класс Player путём наращивания из класса Unit:

Ключевое слово здесь extends ("расширяет"). Класс Player расширяет класс Unit. То есть добавляет в него новые свойства и методы. Теперь класс Player имеет всё, что имеет Unit, плюс своё собственное барахло.

То же самое делаем для монстров:

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

Если рассмотреть такой код:

var player = new Player();

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

"Я вижу, что программист хочет создать новый объект класса Player. Я обращусь к чертежам... В классе Player есть одно свойство ammo, я его создам в объекте. Но класс Player расширяет класс Unit, я посмотрю также на чертежи Unit. Я нашел там несколько свойств, и создам их тоже. Теперь объект содержит свойства класса Unit и свойства класса Player."

И такой код:

player.move();

"Я вижу, что программист хочет вызвать метод move() у объекта player. У объекта нет такого метода. Но он создан по чертежам класса Player, поэтому я посмотрю туда. Там тоже нет такого метода. Но класс Player расширяет класс Unit, значит наследует его методы. Поэтому я посмотрю в Unit. О, нашел метод move(), его я и вызову."

Можно ли отнаследовать от класса новый класс, потом от этого нового класса отнаследовать еще один, потом от него еще один и так далее? Да, можно.

Надолго ли хватит счастья? Посмотрим.

Читайте дальше:

Подборка всех материалов по ООП:

ООП | ZDG | Дзен

Наука
7 млн интересуются