undefined

Множественное наследование интерфейсов

Java Core
3 уровень , 5 лекция
Открыта

— Привет, Амиго! Наконец-то мы добрались до очень интересной темы. Сегодня я расскажу тебе про множественное наследование. На самом деле множественное наследование очень интересный и мощный инструмент. И если бы не некоторые проблемы, то в Java было бы множественное наследование классов. Но т.к. его нет, придется довольствоваться множественным наследованием интерфейсов. Что тоже не мало.

Множественное наследование интерфейсов - 1

Представь, что ты пишешь компьютерную игру. И ее герои – твои объекты – должны демонстрировать очень сложное поведение: ходить по карте, собирать предметы, выполнять квесты, общаться с другими героями, кого-то убивать, кого-то спасать. Допустим, ты смог разделить все объекты на 20 категорий. Это значит, что если тебе повезет, ты можешь обойтись всего 20-ю классами, для их описания. А теперь вопрос на засыпку: сколько всего уникальных видов взаимодействия у этих объектов. Объект каждого типа может иметь уникальные взаимодействия с 20-ю видами других объектов (себе подобных тоже считаем). Т.е. всего нужно запрограммировать 20 на 20 – 400 взаимодействий! А если уникальных видов объектов будет не 20, а 100, количество взаимодействий может достигнуть 10,000!

— Ничего себе! Теперь понимаю, почему программирование такая непростая работа.

— Она простая. Благодаря многим абстракциям. И в не последнюю очередь – множественному наследованию интерфейсов.

Очень часто можно упростить взаимодействие объектов, если взаимодействовать будут не объекты, а их роли и/или способности. А способности, как мы уже знаем, легко добавляются в класс, когда он реализует некоторый интерфейс.

Когда пишется большая программа, обычно с этого сразу и начинают:

1) Определяют все существующие способности/роли.

2) Затем описывают взаимодействие между этими ролями.

3) А потом просто наделяют все классы их ролями.

— А можно пример?

— Конечно. Давай рассмотрим роли, на основе героев мультика «Том и Джерри».

Код на Java Описание
interface Moveable
{}
— роль/способность передвигаться.
interface Eatable
{}
— роль/способность быть съеденным.
interface Eat
{}
— роль/способность съесть кого-нибудь.
class Tom extends Cat implements Moveable, Eatable, Eat
{}
Tom – это кот, у которого есть три роли:
1) может передвигаться
2) может кого-то съесть
3) может быть съеденным кем-то (собакой)
class Jerry extends Mouse implements Moveable, Eatable
{}
Jerry – это мышь, у которого есть две роли:
1) может передвигаться
2) может быть съеденным кем-то
class Killer extends Dog implements Moveable, Eat
{}
Killer – это собака, у которого есть две роли: 1) может передвигаться 2) может кого-то съесть

Зная всего эти три роли (интерфейса) можно написать программу и описать корректное взаимодействие этих ролей. Например, объект будет гнаться (посредством интерфейса Moveable) за тем, «кого ты можешь съесть» и убегать от того, «кто может съесть тебя». И все это без знаний о конкретных объектах. Если в программу добавить еще объектов (классов), но оставить эти роли, она будет прекрасно работать – управлять поведением своих объектов.

Комментарии (88)
Чтобы просмотреть все комментарии или оставить свой,
перейдите в полную версию
Denis 14 уровень
5 мая 2021
Собаку звали Спайк. (раз уж упоминают Тома и Джерри).
Nick 20 уровень
17 апреля 2021
Эээ алё я тут ждал описание наследования интерфейсов от множества других интерфейсов, как это было в задаче:

public interface Itnerfac extends Itnerfac1, Itnerfac2
😡
Vadim 15 уровень, Уфа
9 апреля 2021
По первым строчкам статьи полагал, что лекция о множественном наследии интерфейсов, а оказалась банальщина о множественной реализации интерфейсов. Опять 25, предыдущих лекций на эту тему не хватило?...
Василий 16 уровень
8 апреля 2021
Стал перед тем как читаться статью заглядывать в комментарии. Так вот, статью можно после этого не читать. По коментам понятно о чем речь, и иногда информации в них больше чем в материале.
Maxim 14 уровень, Санкт-Петербург
4 марта 2021
Собака-киллер ест кота... Обалдеть. Ну вы даете! 😅 Больше безумных примеров! Они хорошо запоминаются.
Anonymous #2497433 33 уровень
13 февраля 2021
мда, комментарии лучше не читать - с ошибками комменты набирают много лайков, а искать годноду среди чьих-то рассуждений не всегда верных не стоит потраченного времени - к тому же, сбивают с толку
Angelina Ageeva 23 уровень, Симферополь
3 января 2021
Почему Том, Джерри и Киллер - это классы? Почему не объекты? Мы же не можем создать несколько Томов. Том - вполне завершенный объект ведь, не чертеж (как класс).
🦔 Виктор 20 уровень, Москва Expert
2 января 2021
Вместо тысячи слов: © Ayrat. Всё получится!
Nikola 26 уровень, Киев
3 декабря 2020
Том, кот может бит съеденным собакой!? это вряд ли, максимум покусан. А вот съеденным Уханьским Китайцем это 100% :)))
Владимир Дольфо 23 уровень, Ramenskoe
15 ноября 2020
Вообще-то правильнее Spaik extends Dog) а не Killer