Використовуючи поняття поліморфізму, ви створюєте ієрархію класів і використовуючи посилання батьків, ви викликаєте функції інтерфейсу, не знаючи, який саме тип має об'єкт. Це чудово. Приклад:
У вас є колекція тварин, і ви закликаєте всіх функцій тварин, 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? Можливо, вам доведеться структурувати потік вашої програми, щоб вона була такою, що вона називається задовго до цього.