Ao usar o conceito de polimorfismo, você cria uma hierarquia de classes e, usando a referência dos pais, chama as funções de interface sem saber qual tipo específico tem o objeto. Isso é ótimo. Exemplo:
Você tem uma coleção de animais e solicita a função de todos os animais eate não se importa se é um cachorro comendo ou um gato. Mas na mesma hierarquia de classes você tem animais que possuem outros - além de herdados e implementados da classe Animal, por exemplo makeEggs, getBackFromTheFreezedStatee assim por diante. Portanto, em alguns casos em que você trabalha, você pode querer saber o tipo específico para chamar comportamentos adicionais.
Por exemplo, no caso, é tempo de manhã e se ele é apenas um animal, então você chamar eat, caso contrário, se ele é um ser humano, em seguida, chamar primeiro washHands, getDressede só então chamar eat. Como lidar com esses casos? Polimorfismo morre. Você precisa descobrir o tipo do objeto, que soa como um cheiro de código. Existe uma abordagem comum para lidar com esses casos?
Eaterinterface com o eat()método, então, como cliente, você não se importará que uma Humanimplementação tenha que chamar pela primeira vez washHands()e getDressed()são detalhes da implementação dessa classe. Se, como cliente, você se importa com esse fato, provavelmente não está usando a ferramenta correta para o trabalho.
getDressedantes dele eat, não é o caso do almoço. Dependendo das circunstâncias, washHands();if !dressed then getDressed();[code to actually eat]pode ser a melhor maneira de implementar isso para um ser humano. Outra possibilidade é o que acontece se outras coisas exigirem isso washHandse / ou getDressedforem chamadas? Suponha que você tenha leaveForWork? Pode ser necessário estruturar o fluxo do seu programa para que ele seja chamado muito antes disso.