La respuesta es bastante simple.
¿Cómo manejar objetos que pueden hacer más de lo que espera?
No necesita manejarlo porque no serviría para nada. Una interfaz se diseña generalmente dependiendo de cómo se va a utilizar. Si su interfaz no define el lavado de manos, entonces no le importa como llamador de la interfaz; Si lo hicieras, lo habrías diseñado de manera diferente.
Por ejemplo, en caso de que sea tiempo de la mañana y si es solo un animal, entonces llamas a comer; de lo contrario, si es un ser humano, entonces llama primero a WashHands, getDressed y solo luego a Call. ¿Cómo manejar estos casos?
Por ejemplo, en pseudocódigo:
interface IEater { void Eat(); }
interface IMorningRoutinePerformer { void DoMorningRoutine(); }
interface IAnimal : IEater, IMorningPerformer;
interface IHuman : IEater, IMorningPerformer;
{
void WashHands();
void GetDressed();
}
void MorningTime()
{
IList<IMorningRoutinePerformer> items = Service.GetMorningPerformers();
foreach(item in items) { item.DoMorningRoutine(); }
}
Ahora implementas IMorningPerformer
para Animal
solo para comer, y para Human
también lo implementas para lavarte las manos y vestirte. La persona que llama con su método MorningTime podría importarle menos si es humano o un animal. Todo lo que quiere es realizar la rutina de la mañana, que cada objeto hace admirablemente gracias a OO.
Muere el polimorfismo.
¿O no?
Debes averiguar el tipo de objeto
¿Por qué están asumiendo eso? Creo que esto podría ser una suposición errónea.
¿Existe un enfoque común para manejar estos casos?
Sí, generalmente se resuelve con una jerarquía de clase o interfaz cuidadosamente diseñada. Tenga en cuenta que en el ejemplo anterior no hay nada que contradiga su ejemplo tal como lo ha dado, sin embargo, probablemente se sentirá insatisfecho, ya que hizo algunas suposiciones más que no escribió en la pregunta en el momento de escribir. , y estas suposiciones son probablemente violadas.
Es posible ir a un agujero de conejo si ajustas tus suposiciones y yo modificando la respuesta para satisfacerlas, pero no creo que eso sea útil.
Diseñar buenas jerarquías de clases es difícil y requiere mucha información sobre el dominio de su negocio. Para dominios complejos, uno pasa por dos, tres o incluso más iteraciones, a medida que refinan su comprensión de cómo interactúan las diferentes entidades en su dominio empresarial, hasta que llegan a un modelo adecuado.
Ahí es donde faltan ejemplos simplistas de animales. Queremos enseñar de forma sencilla, pero el problema que intentamos resolver no es obvio hasta que profundiza, es decir, tiene consideraciones y dominios más complejos.