Звичайно, але ми називаємо цей склад і делегацію . Модель стратегії та введення залежностей можуть здатися структурно подібними, але їхні наміри відрізняються.
Шаблон стратегії дозволяє змінювати поведінку під час виконання одного інтерфейсу. Я міг сказати качки крижаниці літати і спостерігати, як вона літає крилами. Потім поміняйте його на качку пілота реактивного літака і спостерігайте, як він літає з авіакомпаніями Delta. Це під час роботи програми - це стратегічний зразок.
Ін'єкція залежності - це техніка, щоб уникнути жорстких залежностей від кодування, щоб вони могли змінюватися незалежно, не вимагаючи, щоб клієнти були змінені, коли вони змінюються. Клієнти просто висловлюють свої потреби, не знаючи, як вони будуть задоволені. Таким чином, спосіб їх зустрічі вирішується в іншому місці (як правило, в основному). Для використання цієї методики вам не потрібно дві качки. Просто щось, що використовує качку, не знаючи і не піклуючись, яка качка. Щось, що не будує качку і не шукає її, але абсолютно радий використовувати будь-яку качку, яку ви їй вручите.
Якщо я маю конкретний клас качок, я можу його реалізувати, це поведінка мух. Я міг би навіть переконати, що він переводить поведінку з крила на крило на літо з дельтою на основі змінної стану. Ця змінна може бути булевою, int, або може бути a, FlyBehavior
яка має fly
метод, який виконує будь-який стиль польоту, без того, щоб я мав тестувати це з if. Тепер я можу змінювати стилі польоту, не змінюючи типів качок. Тепер крижанки можуть стати пілотами. Це склад та делегування . Качка складається з FlyBehavior і вона може делегувати їй запити на політ. Ви можете замінити всі способи поведінки качки одразу таким чином або потримати щось за кожну поведінку чи будь-яку комбінацію між ними.
Це дає вам ті самі повноваження, які має спадщина, крім однієї. Спадкування дозволяє висловити, які методи Дак ви перекриваєте в підтипах Дак. Склад та делегування вимагають від Качки явного делегування на підтипи з самого початку. Це набагато гнучкіше, але воно передбачає більше набору тексту на клавіатурі, і Дак повинен знати, що це відбувається.
Однак багато хто вважає, що спадщина повинна бути чітко розроблена з самого початку. І що, якщо цього не було, ви повинні позначити свої класи як опломбовані / остаточні, щоб заборонити спадкування. Якщо ви дотримуєтесь цієї точки зору, то спадкування дійсно не має переваги перед складом та делегуванням. Тому що тоді або в будь-якому випадку вам доведеться або розробити розширення з самого початку, або бути готовим зірвати речі пізніше.
Зривання речей - насправді популярний варіант. Просто пам’ятайте, що є випадки, коли це проблема. Якщо ви самостійно розгорнули бібліотеки або модулі коду, які не збираєтесь оновлювати наступним випуском, ви можете закінчитися з версіями класів, які нічого не знають про те, що ви зараз маєте.
Незважаючи на те, що згодом готові зірвати речі, ви можете позбавити вас від надмірного проектування, але є щось дуже потужне в тому, щоб мати можливість спроектувати щось, що використовує качку, не знаючи, що качка насправді буде робити при використанні. Те, що не знати, це потужний матеріал. Це дозволяє вам на деякий час перестати думати про качок і продумати решту свого коду.
"Чи можемо ми" і "чи повинні ми" - це різні питання. Улюблений склад над успадкуванням не говорить ніколи не використовуйте спадщину. Ще є випадки, коли успадкування має найбільше значення. Я покажу тобі свій улюблений приклад :
public class LoginFailure : System.ApplicationException {}
Спадкування дозволяє створювати винятки з більш конкретними, описовими іменами лише в одному рядку.
Спробуйте зробити це з композицією, і ви отримаєте безлад. Також немає ризику виникнення проблеми спадкового йо-йо, оскільки тут немає даних або методів для повторного використання та заохочення ланцюга спадкування. Все це додає - це гарне ім’я. Ніколи не варто недооцінювати цінність доброго імені.
Duckbehavior.quackBehavior
та інші поля 'у вашому коді?