Відмова від спадку
Симптоми і ознаки
Якщо підклас використовує лише малу частину успадкованих методів і властивостей суперкласа, це є ознакою неправильної ієрархії. При цьому зайві методи можуть просто не використовуватися або бути перевизначеними і викидати виключення.
![](/images/refactoring/content/smells/refused-bequest-01.png?id=7a1d79e75a3836c22ec865d72c98664e)
Причини появи
Хтось створив наслідування між класами тільки з мотивів повторного використання коду, що знаходиться в суперкласі. При цьому суперклас і підклас можуть бути абсолютно різними сутностями.
![](/images/refactoring/content/smells/refused-bequest-02.png?id=f9b0affd4bbf6fec22c05783fc75562e)
Лікування
-
Якщо наслідування не має сенсу, і підклас насправді не є представником суперкласу, слід позбутися від відношення наслідування між цими класами, застосувавши заміну наслідування делегуванням.
-
Якщо наслідування має сенс, треба позбутися від зайвих полів і методів в підкласі. Для цього необхідно витягнути з батьківського класу всі поля і методи, які потрібні підкласу, в новий суперклас, і зробити обидва класи його спадкоємцями (відокремлення суперкласу).
![](/images/refactoring/content/smells/refused-bequest-03.png?id=2a84293620fa1caf4329fca1f4a44e08)
Виграш
- Покращує розуміння і організацію коду. Тепер ви не витрачатимете час на припущення, чому саме клас
Стілець
є підкласом класуТварина
(незважаючи на те, що в обох є чотири ноги).