Когда вы используете концепцию полиморфизма, вы создаете иерархию классов и, используя родительскую ссылку, вызываете функции интерфейса, не зная, какой конкретный тип имеет объект. Это круто. Пример:
У вас есть коллекция животных, и вы вызываете все функции животных, 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? Возможно, вам придется структурировать поток вашей программы так, чтобы она вызывалась задолго до этого.