Чим різняться наслідування і композиція в Java?


Дізнайтесь більше про нові кар'єрні можливості в EchoUA. Цікаві проекти, ринкова оплата, гарний колектив. Надсилайте резюме та приєднуйтеся до нас.

 

Наслідування і композиція

Давайте розглянемо детальніше відмінності композиції і наслідування. Ми розглянемо кожен пункт докладно, але без нудних деталей.

Гнучкість

Перша відмінність стосується гнучкості коду. При використанні наслідування Ви повинні описати, який клас розширюєте. При цьому, Ви не можете замінити його під час виконання програми. Використовуючи композицію, Ви можете визначити використовуваний тип, який іноді має декілька різних реалізацій. Таким чином, композиція надає значно більше гнучкості, ніж наслідування.

Обмежене повторне використання коду при наслідуванні

Як було сказано вище, наслідування в Java можливе тільки від одного класу, а це означає, що повторно можна використати один, і тільки один клас. Якщо Ви хочете отримати функціональність декількох класів, то Вам слід використати композицію. Наприклад: Ваш код повинен використати аутентифікацію, отже, Вам потрібно наслідувати клас Authenificator, для використання авторизації – Autorizer і т. д. Проте, оскільки множинне наслідування в Java не підтримується, Ви цього зробити не можете. Єдиний вихід – композиція.

Юніт-тести

Важливий аргумент при виборі способу повторного використання коду полягає в тому, що класи, розширені за допомогою композиції, легше тестувати, оскільки Ви завжди можете надати заглушку для використовуваного класу. При наслідуванні Вам знадобиться батьківський клас для тестування, і замінити його заглушкою не вийде.

Final- класи

Неможливість розширити final-класи – ще одне обмеження наслідування. У Java немає можливості наслідуватися від final-класів, тому знову єдиний вихід – використати композицію для повторного використання коду.

Інкапсуляція

Остання відмінність композиції і наслідування в Java полягає в їх відношенні до інкапсуляції. Попри те, що і обидві техніки дозволяють повторно використати код, наслідування порушує принцип інкапсуляції, оскільки підклас залежить від поведінки батьківського класу. Якщо клас-батько змінить свою поведінку, це вплине і на його нащадків. Якщо класи погано документовані й клас-нащадок неправильно використовує батьківський, то за будь-якої зміни батька функціональність нащадка виявиться зламаною. Для того щоб побачити це на прикладі, Ви можете прочитати розділи 16 і 17 Effective Java.

От і все, що можна сказати про відмінності композиції та наслідування в Java і в об’єктно орієнтованому програмуванні взагалі. Як бачите, вони по-різному служать одній меті: повторне використання перевірених і протестованих ділянок коду. Композиція при цьому дозволяє захистити повторно використовуваний клас від клієнтів, тоді як наслідування цього не гарантує. Проте іноді наслідування потрібне. Зокрема, коли Ви створюєте класи з одного сімейства.

Переклад статті “Difference between Inheritance and Composition in Java OOPS”

Київ, Харків, Одеса, Дніпро, Запоріжжя, Кривий Ріг, Вінниця, Херсон, Черкаси, Житомир, Хмельницький, Чернівці, Рівне, Івано-Франківськ, Кременчук, Тернопіль, Луцьк, Ужгород, Кам'янець-Подільський, Стрий - за статистикою саме з цих міст програмісти найбільше переїжджають працювати до Львова. А Ви розглядаєте relocate?


Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *