在我的代码中,我有一个名为Game
的超类及其子类Tower
。 Tower
还有一个名为Catapult
的子类。
Catapult子类看起来像这样:
public class Catapult extends Tower {
public Catapult(){
super(5,3);
}
}
它使用常量整数值5和3调用Tower
构造函数。然后,它的超类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();
}
}
现在,拥有损坏和timeStep(5和3)的值,Tower
调用其超级构造函数(Game):
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的对象。
第二:如何在索引0处获取对象(塔)内的实际整数?所以,我不能这样做:
this.towers.get(0).damage
答案 0 :(得分:1)
您的主要问题似乎是您要使用Tower
课程中的Game
个对象。一个问题是你错误地使用了继承,我将在稍后讨论。另一个更重要的问题是创建对象。您使用
ArrayList
对象
private ArrayList<Tower> towers = new ArrayList<Tower>();
但是,您永远不会创建任何Tower
个对象。确保您拥有一些Tower
个对象的一种方法是在构造函数中创建它们并将它们添加到列表中:
public Game(int corridorLength){
this.corridorLength = corridorLength;
this.towers.add(new Tower());
}
如果您想添加多个塔,您可能应该使用for循环。我将细节作为练习留给读者。
现在您的列表中有一个塔式对象(或多个),但damage
字段是私有的。要访问它,你应该添加一个&#34; getter&#34; Tower
课程的方法:
public int getDamage() {
return damage;
}
现在你可以从列表中找到一座塔:
Tower t = towers.get(0);
并获得其伤害值:
int damage = t.getDamage();
关于继承的说明
在我看来,您对如何使用继承感到困惑。继承通常被称为&#34;是&#34;关系。问自己一个简单的问题:塔是游戏吗?如果答案是&#34;是&#34;那么继承可能是合适的。如果答案是&#34; no&#34;,那么继承肯定是不合适的。
在这种情况下,在我看来,塔是不游戏。另一方面,游戏有一个塔。这表明Game
类应包含Tower
成员变量(或字段):
public class Game {
private Tower tower;
}
同样,Tower 有一个 Catapult,因此Tower
类应包含Catapult
成员字段。由于Tower
和Catapult
都不是Game
,因此这些类应不扩展Game
。从两个类中删除extends Game
子句。
答案 1 :(得分:0)
如果你想打印塔的损坏,你必须在最后打电话给.damage
,否则程序会打印塔而不是损坏。
System.out.println(this.towers.get(this.currentPosition).damage);
答案 2 :(得分:0)
您无法直接访问这些字段,因为它们是私有的。您应该为您想要访问的每个字段提供getter。