Kiedy używasz koncepcji polimorfizmu, tworzysz hierarchię klas, a korzystając z referencji rodziców wywołujesz funkcje interfejsu, nie wiedząc, który konkretny typ ma obiekt. To jest świetne. Przykład:
Masz kolekcję zwierząt i przywołujesz funkcje wszystkich zwierząt eat
i nie obchodzi cię, czy to pies je czy kot. Ale w tej samej hierarchii klas masz zwierzęta, które mają dodatkowe - inne niż odziedziczone i zaimplementowane z klasy Animal
, npmakeEggs
, getBackFromTheFreezedState
i tak dalej. Tak więc w niektórych przypadkach w twojej funkcji możesz chcieć znać konkretny typ, aby wywołać dodatkowe zachowania.
Na przykład, w przypadku, gdy jest poranek, a jeśli jest to tylko zwierzę, wtedy wołasz eat
, w przeciwnym razie, jeśli jest to człowiek, najpierw zadzwoń washHands
, getDressed
a dopiero potem zadzwoń eat
. Jak poradzić sobie z tymi sprawami? Polimorfizm umiera. Musisz znaleźć typ obiektu, który brzmi jak zapach kodu. Czy istnieje wspólne podejście do obsługi tych przypadków?
Eater
interfejs za pomocą tej eat()
metody, to jako klient nie będziesz się przejmować tym, że Human
implementacja musi najpierw wywołać washHands()
i getDressed()
jest to szczegół implementacji tej klasy. Jeśli jako klient zależy Ci na tym fakcie, najprawdopodobniej nie używasz odpowiedniego narzędzia do tego zadania.
getDressed
przed nimi eat
, tak nie jest w przypadku obiadu. W zależności od okoliczności washHands();if !dressed then getDressed();[code to actually eat]
może być najlepszym sposobem na wdrożenie tego dla człowieka. Inną możliwością jest to, czy inne rzeczy tego wymagają washHands
i / lub getDressed
są nazywane? Załóżmy, że masz leaveForWork
? Być może będziesz musiał tak ustrukturyzować przepływ programu, aby tak się nazywał na długo wcześniej.