JavaRush /Java блог /Random UA /Навіщо потрібне успадкування інтерфейсів?
Павел
11 рівень

Навіщо потрібне успадкування інтерфейсів?

Стаття з групи Random UA
Навіщо потрібні інтерфейси? Навіщо потрібне успадкування інтерфейсів? Навіщо потрібний поліморфізм? Для тих, хто шанував і зрозумів, як робити наслідування інтерфейсів, але не зрозумів, навіщо. Минулого разу, на прикладі звичайної родини Іванових, ми розібрали, навіщо потрібні інтерфейси. Продовжуємо оцифровувати неспокійну родину. Кожна людина має якісь звички, які вона ні від кого не успадковувала або нікому не передавала у спадок - її особисті звички. Ми маємо завдання: наділити кожного члена сім'ї унікальними звичками. Перекладаємо в площину Java: треба реалізувати в класах унікальні методи, які належать лише цим класам. Що ж, уперед! Це Петроо:
class Петя implements ПривычкиПапы, ПривычкиМамы {

//это личные Петины привычки
public void ковырятьВНосу () {
System.out.println("Ковырь-ковырь");
    }

//это унаследованные привычки
@Override
public void прихлюпывать() {
     System.out.println("Хлюп");
   }

@Override
public void поджимать () {
System.out.println("Поджать губки");
    }
}
Це Папа:
class Папа implements ПривычкиПапы {

//это личные Папины привычки
public void чесатьБороду () {
System.out.println("Чешу бороду");
    }

//это переданные привычки
   @Override
    public void прихлюпывать() {
     System.out.println("Хлюп");
   }
}
Це мама:
class Мама implements ПривычкиМамы{

//это личные Мамины привычки
public void хлопатьРесницами () {
System.out.println("Хлоп-хлоп");
    }

//это переданные привычки
@Override
public void поджимать() {
System.out.println("Поджать губки");
    }
}
Ідеально! Все працює як слід! У першій статті говорилося, що програма — це відображення реального світу. Найцікавіша властивість реальності – це постійно змінюватися. Сім'я Іванових не стала винятком, у них з'явилася лапочка-дочка на ім'я Маша. І вона успадкувала від Мами звичку плескати віями, а від Папи прихлюпувати. Треба вносити зміни до нашої програми. Навіщо потрібне успадкування інтерфейсів?  - 1Та гаразд, це не так і складно, головне мислити логічно. Адже всі знають, навіщо потрібні інтерфейси. Зараз створимо interface Звички Маші , опишемо там метод плескати вії () і прихлюпувати () імплементуємо його до Маші і справа в капелюсі. Ну і те, що методи з такою назвою вже реалізовані в інших інтерфейсах, один раз можна. Навіщо потрібне успадкування інтерфейсів?  - 2Справді, хто знає які плани у родини Іванових, якщо народиться Сергійко , який успадкує звички від Папи, Мами, ПраДідусі та ще когось із четвертого коліна, щоразу створювати інтерфейс, типу : interface бути оголошено сотні разів в інших інтерфейсах? Через пару, трійку поколінь ми ризикуємо отримати інтерфейси з купою однакових методів, які вже описані в інших інтерфейсах, і якщо треба буде змінити найменування якої-небудь звички (а це цілком реально – світ змінюється), то як розібратися в цьому спагетті, я не уявляю. Залишається тільки сидіти і мріяти про чудо. Навіщо потрібне успадкування інтерфейсів?  - 3Ось якби для кожної звички був свій інтерфейс. Двох представимо:
public interface ПривычкаПрихлюпывать {
    public void прихлюпывать();
}
public interface ПривычкаПоджимать {
    public void поджимать();
}
public interface ПривычкаКовырятьВНосу {
    public void ковырятьВНосу();
}
public interface ПривычкаХлопатьРесницами {
    public void хлопатьРесницами();
}
public interface ПривычкаЧесатьБороду {
    public void чесатьБороду();
}
А потім, можна було б як у лего, за допомогою множинного успадкування з окремих навичок набрати потрібний нам інтерфейс навичок окремого члена сімейства. Якось так:
public interface ПривычкиМамы extends ПривычкаПоджимать, ПривычкаХлопатьРесницами {
    }
public interface ПривычкиПапы extends ПривычкаЧесатьБороду, ПривычкаХлюпать {
    }
public interface ПривычкиПети extends ПривычкаПоджимать, ПривычкаХлюпать,ПривычкаКовырятьВНосу {
    }
public interface ПривычкиМаши extends ПривычкаХлюпать, ПривычкаХлопатьРесницами {
    }
А потім просто імплементувати потрібний інтерфейс потрібному класу, наприклад, Мамі:
class Мама implements ПривычкиМамы{
@Override
public void хлопатьРесницами () {
System.out.println("Хлоп-хлоп");
    }

@Override
public void поджимать() {
System.out.println("Поджать губки");
    }
}
Так само можна було б вчинити з Папою, Петею та Машею . І потім, при розширенні сімейства Іванових, проблем би зі звичками не було, ми б просто їх тасували через успадкування на рівні інтерфейсів, як інгредієнти в салаті, і не плодабо купу методів з однаковим найменуванням. Ех, мрії, мрії... Навіщо потрібне успадкування інтерфейсів?  - 4Намальована людина має рацію, так насправді можна - тепер симуляція сімейства Іванових врятована! Уважний читач може запитати: "А навіщо плодити інтерфейси для кожного члена сім'ї? У нас є набір дій - відразу імплементувати потрібному класу." Уявимо, що в багатьох паралельних світах існують двійники Петі , і всім Петям треба імплементувати .
interface ПривычкиПети extends ПривычкаПоджимать, ПривычкаХлюпать,ПривычкаКовырятьВНосу

class ПетяВселеннаяХ implements ПривычкиПети
class ПетяВселеннаяY implements ПривычкиПети
// и т.д.
А якби спільного інтерфейсу не було
class ПетяВселеннаяХ implements ПривычкаПоджимать, ПривычкаХлюпать,ПривычкаКовырятьВНосу
class ПетяВселеннаяY implements ПривычкаПоджимать, ПривычкаХлюпать,ПривычкаКовырятьВНосу
// и т.д.
Виходить більш об'ємний код, що повторюється. Спадкування інтерфейсів робить додаток більш гнучким до змін, зокрема можна вирішити проблеми з повторюваними методами. Ще раз зверніть увагу, що множинне успадкування інтерфейсів дозволено.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ