将字段从子类获取到超类

时间:2014-07-15 15:29:48

标签: java inheritance field abstract

我正在进行塔防游戏,而且我遇到了一些问题。我创建了一个抽象类Enemy,除了使用这些字段的几个方法外,还有这些字段。

public abstract class Enemy
{
    public int currentX, currentY;
    //currentX(and Y)PF are used for the pathfinder, they are currentX(and Y) - 1
    public int currentXPF, currentYPF;
    public int health;
    public int velocity;
    public int defense;
    public String orientation;

这是Enemy类中的一个函数。

public boolean isDead(){
    if(health == 0){
        return true;
    }
    return false;
}

我想要做的是在子类中定义这些字段(这样我就可以为每种类型的敌人设置一个子类,而没有它们具有相同的值)但是我在实际使它工作时遇到了问题。 / p>

public class BasicEnemy extends Enemy
{
    public int currentX, currentY;
    public int velocity;
    public int health;
    public int defense;
    public String orientation;

    private static int bounty = 50;


    public BasicEnemy(int currentX,int currentY, Board board) {

        this.health = 3;
        this.defense = 0;
        this.velocity = 1;

        this.currentX = currentX;
        this.currentY = currentY;


        this.currentXPF = currentX - 1;
        this.currentXPF = currentY - 1;

        this.orientation = "right";

        //moveSelf is defined in superclass
        this.moveSelf(board);
    }

在另一个课程中,我有一个敌人列表和一个将敌人添加到列表中的功能

private List<Enemy> enemyList;

public void addEnemy(String type){
switch(type){
//probably not the best solution to use strings for this but whatever
    case "basic":
    enemyList.add(new BasicEnemy(startingX,startingY, this));
    break;
}
}

当我尝试遍历我的敌人列表以查看是否有任何敌人死亡时,我的问题出现了

private void checkForDeadEnemies(){
    List<Enemy> deadEnemies = new ArrayList<>();
    for (Enemy enemy : enemyList){
        if(enemy.isDead()){
            deadEnemies.add(enemy);
        }
    }
    for(Enemy enemy : deadEnemies){
        enemyList.remove(enemy);
        register.increaseBalance(enemy.getBounty());
        notifyAllListeners();
    }
}

目前我的问题是isDead()函数总是返回true,即使我的所有敌人都是BasicEnemy并且应该有3个生命值(因为他们还没有办法造成伤害)。

我假设isDead()函数使用Enemy类中的健康字段,该字段尚未设置为任何内容,而不是使用子类中的健康字段。

我不想使用抽象函数,因为如果我要制作几种类型的敌人会导致大量重复代码。 我基本上希望我的超类中的函数使用子类中的字段,或者将超类中的字段设置为子类中的值。

2 个答案:

答案 0 :(得分:3)

您已在health中定义了字段Enemy,为什么还要在BasicEnemy中定义该字段?从health的任何子类中删除Enemy字段,它将起作用。

答案 1 :(得分:1)

问题是因为你在声明子类和超类中的字段,所以子类最终会得到这些字段的2个副本,例如Enemy.currentXBasicEnemy.currentX。 Enemy中的方法是检查Enemy中声明的字段,但BasicEnemy子类正在修改它自己的字段。删除BasicEnemy中的重复声明,它应该可以正常工作。