访问扩展类方法

时间:2013-09-22 07:14:15

标签: java bluej

我有一个名为Occupantextended Occupant classes的课程,用于不同的占用者类型,例如动物,食物,工具,宝藏

所有占用者都被放置在GridSquares上,A Square可容纳 3名占用者

当给出位置时,乘员类有一个方法获取GridSqure上的所有占用者。 该方法将返回带有扩展占用者类的乘员数组。(E.G:动物,工具和食物)。

   Occupant[] allOccupants = newGridSquare.getOccupants();

    for ( Occupant oneOccupant : allOccupants)
      {
         if(oneOccupant.getStringRepresentation() == "A")
         {

             player.reduceStamina(oneOccupant.getDanger());

         }
     }

编译器无法访问Animal类中的getDanger方法,因为我已将其指定为Occupant。

如何在扩展的占用者类动物中访问getDanger方法?

2 个答案:

答案 0 :(得分:1)

您可以投射实例

for ( Occupant oneOccupant : allOccupants)
{
    if("A".equals(oneOccupant.getStringRepresentation()))
    {
        Animal animal = (Animal) oneOccupant;
        player.reduceStamina(animal.getDanger());
    }
}

假设"A"Animal实例的标识符,而Animal是Occupant的子类,并且有getDanger()方法。否则,先做检查

if (oneOccupant instanceof Animal) {
     Animal animal = (Animal) oneOccupant;
     player.reduceStamina(animal.getDanger());
}

相关:

答案 1 :(得分:0)

由于getDanger在Occupant类下不存在,但在特定的Animal类中不存在。因此,你需要向一个职业分类转到一个动物类。

另一个解决方案是在Occupant类下声明getDanger并在扩展类下实现它。对于除Animal之外的类,您可以提供空实现。但从设计的角度来看,这不是一个好的方法,但有时会使用遗留代码