Використовуючи поняття поліморфізму, ви створюєте ієрархію класів і використовуючи посилання батьків, ви викликаєте функції інтерфейсу, не знаючи, який саме тип має об'єкт. Це чудово. Приклад:
У вас є колекція тварин, і ви закликаєте всіх функцій тварин, eat
і вам не байдуже, їсть це собака чи кішка. Але в тій же ієрархії класів у вас є додаткові тварини, крім успадкованих та реалізованих від класу Animal
, наприклад makeEggs
, getBackFromTheFreezedState
тощо. Тож у деяких випадках у вашому функціонуванні ви можете дізнатися конкретний тип, щоб викликати додаткову поведінку.
Наприклад, якщо це ранковий час, і якщо це просто тварина, то ви телефонуєте eat
, інакше, якщо це людина, то дзвоніть спочатку washHands
, getDressed
а вже потім дзвоніть eat
. Як впоратися з цими справами? Поліморфізм гине. Потрібно з’ясувати тип об’єкта, який звучить як запах коду. Чи існує спільний підхід до вирішення цих випадків?
Eater
інтерфейс із eat()
методом, то, як клієнта, вам не байдуже, що його Human
впроваджувати потрібно для першого виклику, washHands()
і getDressed()
це деталі реалізації цього класу. Якщо ви, як клієнт, дбаєте про цей факт, то, швидше за все, ви не використовуєте правильний інструмент для роботи.
getDressed
перед ними eat
, це не стосується обіду. Залежно від ваших обставин, washHands();if !dressed then getDressed();[code to actually eat]
найкращий спосіб реалізувати це для людини. Інша можливість полягає в тому, що якщо інші речі вимагають цього washHands
та / або getDressed
називаються? Припустимо, у вас є leaveForWork
? Можливо, вам доведеться структурувати потік вашої програми, щоб вона була такою, що вона називається задовго до цього.