Quando usi il concetto di polimorfismo crei una gerarchia di classi e usando i riferimenti dei genitori chiami le funzioni dell'interfaccia senza sapere quale tipo specifico ha l'oggetto. Questo è fantastico Esempio:
Hai una collezione di animali e chiami la funzione di tutti gli animali eat
e non ti importa se si tratta di un cane che mangia o di un gatto. Ma nella stessa gerarchia di classi hai animali che hanno ulteriori - oltre a quelli ereditati e implementati dalla classe Animal
, ad esempio makeEggs
, getBackFromTheFreezedState
e così via. Quindi in alcuni casi nella tua funzione potresti voler conoscere il tipo specifico per chiamare comportamenti aggiuntivi.
Ad esempio, nel caso in cui è giunto il momento di mattina e se è solo un animale, allora si chiama eat
, altrimenti se si tratta di un essere umano, quindi chiamare prima washHands
, getDressed
e solo allora chiamare eat
. Come gestire questi casi? Il polimorfismo muore. Devi scoprire il tipo di oggetto, che suona come un odore di codice. Esiste un approccio comune per gestire questi casi?
Eater
un'interfaccia con il eat()
metodo, quindi come client, non ti interessa che Human
un'implementazione debba prima chiamare washHands()
ed getDressed()
è dettagli di implementazione di questa classe. Se, come cliente, ti interessa questo fatto, molto probabilmente non stai utilizzando lo strumento corretto per il lavoro.
getDressed
prima di loro eat
, non è così per il pranzo. A seconda delle circostanze, washHands();if !dressed then getDressed();[code to actually eat]
potrebbe essere il modo migliore per implementarlo per un essere umano. Un'altra possibilità è cosa succede se altre cose lo richiedono washHands
e / o getDressed
vengono chiamati? Supponi di avere leaveForWork
? Potrebbe essere necessario strutturare il flusso del programma in modo tale che venga chiamato molto prima.