如何在Java中的多态数组中存储的对象上调用方法?

时间:2016-11-02 11:33:09

标签: java arrays polymorphism

嗨,谢谢你花时间看看我的问题。

我正在尝试在对象数组中保存的对象上调用方法。

有三类:卡片,卫兵和甲板。

Guard类扩展了Cards类。

数组的类型为“Cards”,并在Deck类中实例化。

卡片类几乎是空的:

public class Cards  {
}

存储在数组中的对象是Guard类型。这是Guard类及其状态和方法:

public class Guard extends Cards{

    private int cardScore = 2;
    private String cardName = "Guard";
    private String cardAbility = "this is the guard's ability";

    public void printGuardInfo()
    {
        System.out.println("This card score fo the guard is:      "+cardScore);
        System.out.println("The card name is: "+ cardName);
        System.out.println("The card ability is" + cardAbility);
    }
}

我在Deck类中实例化数组。然后我用Guard类型的对象填充一系列类型的卡片。我相信这是多态的。

这有效,我可以打印每个索引点保存的参考变量。

public class Deck {
    Cards[] deck = new Cards[16];

    public Cards[] getDeck() {
        return deck;
    }

    public void addGuards()
    {
        for(int i=0; i<5; i++)
        {
            deck[i] = new Guard();
            deck[i].printGuardInfo();// Error: cannot resolve method     printGuardInfo()
        }
    }  
}

我的问题是我现在无法在deck [i]上调用printGuardInfo()方法。

我已经搜索并搜索了一段时间,但没有成功。我觉得我需要一个接口或某种抽象类。不幸的是,我在这些领域的知识不足。

非常感谢任何帮助,谢谢。

5 个答案:

答案 0 :(得分:5)

我推销这样的东西:

Cards成为interface

public interface Cards  {
    void print();
}

Guard实现此接口并使用所需信息覆盖print方法。

public class Guard implements Cards{
    // ... Other methods and stuff
    @Override
    public void print() {
        System.out.println("This card score fo the guard is:      "+cardScore);
        System.out.println("The card name is: "+ cardName);
        System.out.println("The card ability is" + cardAbility);
    }
    // ... Other methods and stuff
}

现在在循环中你只需要调用

deck[i].print();

现在打印的内容取决于必须打印的内容的实际执行情况,但通常情况下,Cards课程会知道它现在可以print

修改:在@chrylis评论后,您的班级应该被称为Card,而不是Cards。这里的原因?这就像是单一类型的Card(此处为类)的简单计划,但不代表多个Cards(多个卡将是Card的实例)。

答案 1 :(得分:3)

虽然一些建议的解决方案在狭义的情况下有意义(使用instanceof的组合并将受影响的Cards元素投射到Guard以调用printGuardInfo ),继承的设计可能存在更广泛的问题。

假设Cards实际上不是一个空类(否则层次结构确实没有产生任何好处),我的建议是将您的卡对象分组到一个公共接口或抽象类(例如Card ),并让该接口为printInfo等一般方法提供抽象,然后由每个Card类型实现(您将在printGuardInfo中获得Guard代码那里实施)。

反过来,在迭代你的数组时,你会在每张卡上调用printInfo,知道Card的每个孩子都有自己的printInfo实现,而不需要施放或使用instanceof

答案 2 :(得分:2)

您需要将Card转换为Guard

((Guard) deck[i]).printGuardInfo();

答案 3 :(得分:2)

最简单,最面向对象的方法是将printGuardInfo更改为toString

public String toString()
{
    return new StringBuilder("This card score fo the guard is:      ")
                  .append(cardScore).append('\n')
                  .append("The card name is: ")
                  .append(cardName).append('\n')
                  .append("The card ability is ")
                  .append(cardAbility)
                  .toString();
}

然后,您可以调用String guardInfo = deck[i].toString();获取保护信息并将其写入标准输出,记录器等。

public String toString()继承自Object,因此无需转换即可调用它。

答案 4 :(得分:2)

R2-D2是对的,但是如果你想要更多'多态',你应该做类似这样的事情

public interface ICard {
    public void printInfo();

}

public class Card implements ICard{

  public void printInfo(
    System.out.println("Card Info");
  }
}

public class Guard extends Card {

   public void printInfo{
        System.out.println("GUARD Info");
 }
}


public vlass Deck{
...
public void addGuards()
{
        for(int i=0; i<5; i++)
        {
          deck[i] = new Guard();
          deck[i].printInfo();
        }
    }  

}

甚至使用抽象类