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 eat
e 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
, getBackFromTheFreezedState
e 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
, getDressed
e 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?
Eater
interface com o eat()
método, então, como cliente, você não se importará que uma Human
implementaçã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.
getDressed
antes 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 washHands
e / ou getDressed
forem chamadas? Suponha que você tenha leaveForWork
? Pode ser necessário estruturar o fluxo do seu programa para que ele seja chamado muito antes disso.