Множинне успадкування в Java
Множинне успадкування в Java
Ромбоподібна проблема
Множинне успадкування Інтерфейсів
Композиція проти успадкування
Припустимо, що ми маємо суперклас і клас, що розширює його:
Наведений вище код компілюється та працює добре. Але, якщо ми змінимо реалізацію класу ClassC , як показано нижче:
Зверніть увагу, що метод test() вже існує в підкласі, але тип значення, що повертається, відрізняється. Тепер клас ClassD не буде компілюватися і якщо ви будете використовувати будь-який IDE, то вона вам запропонує змінити тип значення, що повертається в суперкласі або підкласі.
Тепер уявіть собі ситуацію, коли ми маємо багаторівневу ієрархію спадкування класів і не маємо доступу до суперкласу. У нас не буде жодного вибору, окрім як змінити нашу сигнатуру методу підкласу чи його ім'я, щоб видалити помилку компіляції. Також ми маємо змінити метод підкласу у всіх місцях, де він викликається. Таким чином, успадкування робить наш код крихким.
Вищезгадана проблема ніколи не станеться з композицією і це робить її привабливішою до спадкування.
Інша проблема з наслідуванням полягає в тому, що ми надаємо всі методи суперкласу клієнту і якщо наш суперклас належним чином не розроблений і є прогалини в системі безпеки, то навіть при тому, що ми найкраще виконуємо реалізацію нашого класу, на нас впливає погана реалізація суперкласу . Композиція допомагає нам у забезпеченні керованого доступу до методів суперкласу, тоді як успадкування не забезпечує управління методами суперкласу. Це також одна з основних переваг композиції відуспадкування.
Ще одна перевага композиції – те, що вона забезпечує гнучкість у викликі методів. Наша реалізація класу ClassC представлена вище не оптимальна і забезпечує зв'язування часу компіляції з методом, який буде викликатись. З мінімальними змінами ми можемо зробити виклик методу гнучким та динамічним.
Результат програми представленої вище:
Ця гнучкість при виклик методу не доступна при успадкування, що додає ще один плюс на користь вибору композиції.
Побічні тестування легше робити при композиції, тому що ми знаємо, що всі методи ми використовуємо від суперкласу і можемо копіювати їх для тесту. Тоді як у спадкуванні ми залежимо переважно від суперкласу і не знаємо всіх методів суперкласу, які будуть використовуватися. Таким чином, ми повинні тестувати всі методи суперкласу, що є додатковою роботою через спадкування.
В ідеалі ми повинні використовувати успадкування лише коли ставлення підкласу до суперкласу визначається як «є». В інших випадках рекомендується використовувати композицію.