Cuando utiliza el concepto de polimorfismo, crea una jerarquía de clases y, utilizando la referencia de los padres, llama a las funciones de la interfaz sin saber qué tipo específico tiene el objeto. Esto es genial. Ejemplo:
Tienes una colección de animales y llamas a todas las funciones de los animales eat
y no te importa si es un perro comiendo o un gato. Pero en la misma jerarquía de clases hay animales que tienen otros, además de heredados e implementados de la clase Animal
, por ejemplo makeEggs
, getBackFromTheFreezedState
etc. Entonces, en algunos casos en su función, es posible que desee conocer el tipo específico para llamar a comportamientos adicionales.
Por ejemplo, en caso de que sea la hora de la mañana y si es solo un animal, llame eat
, de lo contrario, si es un humano, llame primero washHands
, getDressed
y solo luego llame eat
. ¿Cómo manejar estos casos? El polimorfismo muere. Debe averiguar el tipo de objeto, que suena como un olor a código. ¿Existe un enfoque común para manejar estos casos?
Eater
interfaz con el eat()
método, entonces, como cliente, no le importa que una Human
implementación tenga que llamar primero washHands()
y getDressed()
es una implementación de detalles de esta clase. Si, como cliente, le importa este hecho, lo más probable es que no esté utilizando la herramienta correcta para el trabajo.
getDressed
antes eat
, ese no es el caso para el almuerzo. Dependiendo de sus circunstancias, washHands();if !dressed then getDressed();[code to actually eat]
podría ser la mejor manera de implementar esto para un ser humano. Otra posibilidad es ¿qué pasa si otras cosas requieren eso washHands
y / o getDressed
se llaman? ¿Y si tienes leaveForWork
? Es posible que necesite estructurar el flujo de su programa para tenerlo de modo que se llame mucho antes de eso de todos modos.