当使用多态性的概念时,您将创建一个类层次结构,并使用父代引用来调用接口函数,而无需知道对象具有哪种特定类型。这很棒。例:
您有动物的集合,并且可以调用所有动物的功能,eat
而不必关心它是吃狗还是猫。但是在同一个类层次结构中,您的动物除了从类继承和实现Animal
(例如makeEggs
,getBackFromTheFreezedState
等等)外,还具有其他动物。因此,在某些情况下,您可能需要了解调用其他行为的特定类型。
例如,如果是早晨,如果它只是一只动物,那么您可以致电eat
;否则,如果是人类,那么请首先致电washHands
,getDressed
然后再致电eat
。如何处理这种情况?多态性死亡。您需要找出对象的类型,这听起来像是代码气味。是否有处理这种情况的通用方法?
Eater
使用该eat()
方法定义接口,则作为客户端,您不必关心Human
必须先调用washHands()
和getDressed()
的实现,它是此类的实现细节。如果作为客户,您确实关心这个事实,那么您很可能没有使用正确的工具来完成工作。
getDressed
在他们面前eat
吃午餐,而情况并非如此。根据您的情况,washHands();if !dressed then getDressed();[code to actually eat]
可能是对人类实施此操作的最佳方法。如果其他事物需要washHands
和/或被getDressed
调用,另一种可能性是怎么办?假设你有leaveForWork
?您可能需要对程序流程进行结构调整,以使其在此之前很久就被调用。