我正在处理一个需要我使用polimorphism概念的项目atm。
我有这个问题:
想象一下,我有一个代表所有哺乳动物的界面,然后我创建了以下子类:人类和鲸鱼。
想象一下,现在我想在我的程序中创建一些人类和一些鲸鱼,我会将它们保存在一系列哺乳动物中。
事实是,子类Human
有solveMathProblem()
方法,而Whale
类没有,因此哺乳动物也没有。
我怎么能在数组中使用该方法?(例如:mammals[2].solveMathProblem();
)
由于在哺乳动物界面中未指定solveMathProblem()
,因此无法正常工作,因为只有人类才能这样做。
我该怎么做才能做到这一点?
答案 0 :(得分:0)
对子类对象的超类引用无法访问超类中未定义的方法。
您需要明确地将您的Mammal引用转换为Human引用,以便能够访问Human中存在的方法,如下所示:
((Human)mammals[2]).solveMathProblem();
话虽如此,您应该看一下如何通过合成添加行为的策略模式。 This回答在解释这个概念方面做得很好。在您的特定情况下,您可以通过引入新的行为层次结构,为不同的Mammal实现添加不同的行为。
答案 1 :(得分:0)
在调用solveMathProblem方法之前,为什么不在循环中使用instanceof运算符。
答案 2 :(得分:0)
我能想到两种方式,两种方式都可能很好:
您可以为solveMathProblem
Mammal
声明interface
:
interface
class
MammalCore
implement
solveMathProblem
中MammalCore
的方法,它会抛出异常,表明操作不受支持(这种方式是默认行为) solveMathProblem
Human
这样,如果在数组中调用solveMathProblem,将为Whale实例抛出异常并为Human实例准确执行您可以使用Reflection。在您的循环中,您可以检查每个对象,solveMathProblem
是否存在(How To Check If A Method Exists At Runtime In Java?)和invoke方法(如果有)。