2017-10-07 33 views
0

在我的代码中,我有一个叫做Game的超类,它的子类TowerTower也有它的子类Catapult。 凯达普子类看起来是这样的:我无法获得我的数组列表中的对象

public class Catapult extends Tower { 
    public Catapult(){ 
     super(5,3); 
    } 
} 

它要求Tower构造与恒定的整数值5和3。然后,它的超Tower看起来是这样的:

public class Tower extends Game { 
    private int damage; 
    private int timeStep; 
    private int position; 
    private boolean willFire; 

    public Tower(int damage, int timeStep){ 
     super.addTower(damage,timeStep); 
    } 
    public Tower(int damage, int timeStep, int position,boolean willFire){ 
     this.damage = damage; 
     this.timeStep = timeStep; 
     this.position = position; 
     this.willFire = willFire; 
    } 
    public void getDamage(){ 
     super.printDamage(); 
    } 

} 

所以,现在,具有价值损伤和时间步长(5,3),Tower调用它的超级构造函数(游戏):

import java.util.ArrayList; 
public class Game { 
    private ArrayList<Enemy> enemies = new ArrayList<Enemy>(); 
    private ArrayList<Tower> towers = new ArrayList<Tower>(); 
    private int corridorLength; 
    private int currentPosition = 0; 

    public Game(){} 

    public Game(int corridorLength){ 
     this.corridorLength = corridorLength; 
    } 

    public void addTower(int damage,int timeStep){ 
     this.towers.add(new Tower(damage,timeStep,this.currentPosition,true)); 
    // Add tower with current position corrdor length 
     System.out.println("Tower added in addTower!");} 

    public void printDamage(){ 
     System.out.println(this.towers.get(this.currentPosition)); // How to get the damage item? 
    } 
} 

所以对象Tower与它的值被存储在阵列塔(至少我假设如此)。因此,有一个非空阵列称为至少大小为1的塔,我在这里面临一些问题。 首先:当我调用Tower.getDamage()方法时,它最终调用Game类中的方法,该方法仅在索引0处打印对象Tower。但是,当我尝试以其他方式进行操作时,例如像这样打印Game类中的对象(从Game类直接调用,而不是通过其Tower子类调用):

public void getDamage(){ 
    System.out.println(this.towers.get(this.currentPosition)); 
} 

它抛出一个超出范围的数组例外,我不明白的,因为阵列塔应该存储在索引对象0.

第二:如何获得对象内的实际整数t(塔)在索引0?所以,我不能这样做:如果你要打印的塔的伤害

this.towers.get(0).damage 
+8

快速浏览一下你的代码,我发现你似乎大大地误用了继承。塔为什么要扩展游戏?没有意义,因为塔怎么能成为一个更专业的子类型的游戏? –

+0

塔是游戏中的一个对象。当我说对象时,我的意思是像简单的对象(汽车和摩托车都是汽车的对象)。 –

+0

塔也不会被添加到塔上的建筑领域。事实上,每一个新的Tower()都会创建一个新的带有空塔列表的游戏。 –

回答

0

,你必须在最后调用.damage,否则程序要打印塔,而不是伤害。

System.out.println(this.towers.get(this.currentPosition).damage); 
+0

是的,这是我最初的想法,但我的IDE说这是一个错误 –

+0

是的,因为'损害'是**私人**价值。要么让它可以访问(在这种情况下是''public''),或者你提供一个getter-method来访问(最好)。 – Zabuza

0

您不能直接访问这些字段,因为它们是私人的。您应该为每个您想要访问的字段提供获取者。

+0

是的,谢谢。第一个问题呢?这让我非常困扰。 –

+0

您确定在调用方法打印第一个方法之前添加了任何塔吗? – NiVeR

+0

是的,我已经将第一个对象游戏初始化为Game的一个实例,然后基于我的代码初始化了一个新的Catapult实例,我相信它会初始化Tower。然后我试图打印“game.getDamage();”,这给我一个错误。文字“Tower在addTower中添加!”被给出 –

1

您的主要问题似乎是您想使用Game类中的Tower对象。一个问题是你错误地使用了继承,我稍后会解决它。另一个更重要的问题是创建对象。您正确地创建一个ArrayList对象与

private ArrayList<Tower> towers = new ArrayList<Tower>(); 

但是,你永远不会创建任何Tower对象。确保你有一些Tower对象的一种方式是在构造函数来创建它们并将它们添加到列表中:

public Game(int corridorLength){ 
    this.corridorLength = corridorLength; 

    this.towers.add(new Tower()); 
} 

如果你想添加一个以上的塔,你应该用一个for循环这样做。我把这些细节作为练习留给读者。

现在,您的列表中有一个塔对象(或多个),但damage字段是私人的。为了访问它,你应该添加一个“吸”的方式你Tower类:

public int getDamage() { 
    return damage; 
} 

现在你可以从列表中塔:

Tower t = towers.get(0); 

,并得到其伤害值:

int damage = t.getDamage(); 

注意有关继承

在我看来,你对如何使用继承感到困惑。继承通常被称为“是一种”关系。问问自己一个简单的问题:塔是游戏吗?如果答案是“是”,则继承可能是合适的。如果答案是“否”,那么继承是绝对不合适的。

在这种情况下,在我看来,塔是而不是一场比赛。另一方面,游戏有一个塔。这表明Game类应包含一个Tower成员变量(或场):

public class Game { 
    private Tower tower; 
} 

类似地,塔具有弹射器,所以Tower类应包含一个Catapult成员字段。由于TowerCatapult都不是Game,所以这些类别应该是而不是延伸Game。删除这两个类中的extends Game子句。

+0

游戏已经有一个叫塔的成员。如果可以看到,ArrayList将包含几个Tower对象。所以1场比赛将有几个塔。另外,对于弹射器,我认为它更像是一种“是-α”的关系,因为塔会有不同的类型 –

+0

这个答案似乎没有解决OP问题,它试图解决其他不相关的问题。对于我们现在的游戏和塔可以是'A'和'B'。 – NiVeR

+0

@NiVeR我编辑了我的答案,以解决OP的核心问题。 –

相关问题