La risposta è abbastanza semplice.
How to handle objects that can do more than you expect?
Non è necessario gestirlo perché non servirebbe a nulla. Un'interfaccia di solito è progettata a seconda di come verrà utilizzata. Se la tua interfaccia non definisce le mani di lavaggio, allora non ti interessa come il chiamante dell'interfaccia; se l'avessi fatto lo avresti progettato diversamente.
For example, in case it is morning time and if it is just an animal then you call eat, otherwise if it is a human, then call first washHands, getDressed and only then call eat. How to handle this cases?
Ad esempio, in pseudocode:
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(); }
}
Ora implementi IMorningPerformer
per Animal
solo per mangiare e per Human
la impili anche per lavarti le mani e vestirti. Il chiamante del tuo metodo MorningTime potrebbe interessare di meno se si tratta di un animale o di un animale. Tutto ciò che vuole è la routine mattutina, che ogni oggetto fa mirabilmente grazie a OO.
Polymorphism dies.
O lo fa?
You need to find out the type of the object
Perché lo stai assumendo? Penso che questo potrebbe essere un assunto sbagliato.
Is there a common approach to handle this cases?
Sì, di solito è risolto con una gerarchia di classi o interfacce attentamente progettata. Nota che nell'esempio sopra non c'è nulla che contraddica il tuo esempio come tu l'hai dato, tuttavia, probabilmente ti sentirai insoddisfatto, perché hai fatto alcune ipotesi che non hai scritto nella domanda al momento della scrittura e queste supposizioni sono probabilmente violate.
È possibile andare in una tana del coniglio stringendo le tue ipotesi e io modificando la risposta per soddisfarle, ma non penso che sarebbe utile.
La progettazione di gerarchie di buone classi è difficile e richiede molte informazioni sul tuo dominio aziendale. Per domini complessi, si passano più di due, tre o anche più iterazioni, dal momento che perfezionano la loro comprensione di come interagiscono entità diverse nel loro dominio aziendale, fino a quando non arrivano a un modello adeguato.
Ecco dove mancano esempi di animali semplicistici. Vogliamo insegnare in modo semplice, ma il problema che stiamo cercando di risolvere non è ovvio fino a quando non vai più a fondo, cioè ci sono considerazioni e domini più complessi.