— Привіт! Нарешті ми дісталися дуже цікавої теми. Сьогодні я розповім тобі про множинне успадкування . Насправді множинне успадкування дуже цікавий і потужний інструмент. І якби не деякі проблеми, то в 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) за тим, «кого ти можеш з'їсти» і тікати від того, «хто може з'їсти тебе». І все це без знань про конкретні об'єкти. Якщо до програми додати ще об'єктів (класів), але залишити ці ролі, вона чудово працюватиме – керуватиме поведінкою своїх об'єктів.