从其他类访问子类方法

时间:2015-01-22 05:38:17

标签: java object arraylist subclass extend

所以我正在进行纸牌游戏。

我的main中有一个类型为player的arrayList,我已经填充了某种类型的玩家(在这种情况下,一个好的玩家 - 好的玩家是玩家的子类,有几个额外的方法)

我可能只是因为看了这么久而脑子里死了,但是我的代码就是这样。

我创造了4个好球员 - 再次 - goodPlayer扩展球员

ArrayList<Player> players = new ArrayList<>();
    for (int i = 0; i < 4; i++) 
    {
                    goodPlayer gp = new goodPlayer();
                    players.add(gp); 
     }

然后在调用几个方法之后我想在goodPlayer中调用一个名为count的方法,在playerList中的每个goodPlayers上调用

for (Player p : players)
{
            count(p.getHand());
 }

我做错了什么,因为我现在的错误是不正确的,除非我将count设为静态并调用goodPlayer.count但是我不希望该类在静态上下文中操作。 感谢。

4 个答案:

答案 0 :(得分:1)

为什么不使用类型转换?您不需要将count方法设为静态方法来使用它。如果您100%确定该列表中的所有玩家都来自GoodPlayer类(按照惯例,类名以大写字母开头),那么只需将其转换为

((GoodPlayer) player).count();

如果您不确定所有玩家是否都来自GoodPlayer类,请添加测试以避免运行时错误:

if (player instanceof GoodPlayer) {
     ((GoodPlayer) player).count();
}

答案 1 :(得分:1)

解决方案是在您的抽象播放器类中添加一个方法,并在派生类型的播放器中实现不同的方法。例如:

public abstract class Player
{
    public abstract int count();
}

public class GoodPlayer extends Player
{
  public int count()  
  {
    return totalHandsPlayed * 3; //Or something meaningful;
  }

}

此示例显示您有一个基类,要求任何继承的类实现定义为abstract的方法。 (在这种情况下计数)。

答案 2 :(得分:0)

如果您的玩家列表总是持有GoodPlayer对象,那么最好将其作为GoodPlayers列表

否则,用户mehmetakcay给出的答案最适合您的目的。

答案 3 :(得分:0)

虽然您提供的信息似乎有点抽象,但您可以通过以下方式进行(使用向下转换,但不推荐):

for(Player p:players){
            GoodPlayer gp=(GoodPlayer)p;
            gp.count();
        }