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