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 eati 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 , getBackFromTheFreezedStatei 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, getDresseda 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?
Eaterinterfejs za pomocą tej eat()metody, to jako klient nie będziesz się przejmować tym, że Humanimplementacja 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.
getDressedprzed 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ą washHandsi / lub getDressedsą 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.