Java Polymorphism在SuperClass数组上调用子类的方法

时间:2015-04-04 12:50:33

标签: java

我正在处理一个需要我使用polimorphism概念的项目atm。

我有这个问题:

  

想象一下,我有一个代表所有哺乳动物的界面,然后我创建了以下子类:人类和鲸鱼。

     

想象一下,现在我想在我的程序中创建一些人类和一些鲸鱼,我会将它们保存在一系列哺乳动物中。

事实是,子类HumansolveMathProblem()方法,而Whale类没有,因此哺乳动物也没有。

我怎么能在数组中使用该方法?(例如:mammals[2].solveMathProblem();

由于在哺乳动物界面中未指定solveMathProblem(),因此无法正常工作,因为只有人类才能这样做。

我该怎么做才能做到这一点?

3 个答案:

答案 0 :(得分:0)

对子类对象的超类引用无法访问超类中未定义的方法。

您需要明确地将您的Mammal引用转换为Human引用,以便能够访问Human中存在的方法,如下所示:

((Human)mammals[2]).solveMathProblem();

话虽如此,您应该看一下如何通过合成添加行为的策略模式。 This回答在解释这个概念方面做得很好。在您的特定情况下,您可以通过引入新的行为层次结构,为不同的Mammal实现添加不同的行为。

答案 1 :(得分:0)

在调用solveMathProblem方法之前,为什么不在循环中使用instanceof运算符。

答案 2 :(得分:0)

我能想到两种方式,两种方式都可能很好:

  1. 您可以为solveMathProblem Mammal声明interface

    • 声明interface
    • 的方法
    • 创建名为class
    • MammalCore
    • implement solveMathProblemMammalCore的方法,它会抛出异常,表明操作不受支持(这种方式是默认行为)
    • 覆盖solveMathProblem Human 这样,如果在数组中调用solveMathProblem,将为Whale实例抛出异常并为Human实例准确执行
  2. 您可以使用Reflection。在您的循环中,您可以检查每个对象,solveMathProblem是否存在(How To Check If A Method Exists At Runtime In Java?)和invoke方法(如果有)。