Перевага відбувається тоді, коли обидва кандидати мають право. Проблема, викладена у запитанні, не спрацьовує в цьому обліковому записі, оскільки вона має лише варіант композиції.
"Композиція також може використовувати узагальнення". Чи має це твердження для нас сенс? Якщо ні, то ми ще не готові зрозуміти правило «прихильності».
Чому ми надаємо перевагу композиції, це те, що Композиція пропонує більше можливостей розширення / гнучкості, ніж узагальнення. Це розширення / гнучкість стосується переважно гнучкості виконання / динаміки (що досягається комбінацією інтерфейсів та композиції).
Користь видно не відразу. Щоб побачити вигоду, потрібно дочекатися наступного несподіваного запиту на зміну. Тож у більшості випадків у тих, хто дотримується генералізації, не вдається порівняти з тими, хто прийняв склад (за винятком одного очевидного випадку, про який згадували пізніше). Звідси правило. З точки зору навчання, якщо ви можете успішно реалізовувати ін'єкцію залежності, то ви повинні знати, якому саме віддати перевагу та коли. Правило допомагає вам у прийнятті рішення, коли ви не впевнені, який вибрати. Знову ви повинні мати можливість бачити обидва варіанти в першу чергу для того, щоб віддати перевагу одному.
Короткий зміст: Склад: З'єднання зменшується лише наявністю дрібних речей, які ви підключаєте до чогось більшого, а більший об'єкт просто викликає менший об'єкт назад. Генералізація: З точки зору API стороннього виробника, що визначає, що метод може бути відмінено, є більш сильним зобов'язанням, ніж визначення того, що метод можна викликати (впевнений виграш для Генералізації). І ніколи не забувайте, що для композиції ви також використовуєте генералізацію із інтерфейсу замість великого класу. Але вся заслуга, на жаль, припадає на склад.