Java - 列表和方法

时间:2015-11-01 16:01:39

标签: java oop

我有一个名为Spell的抽象类。 Spell类假设有几个子类,如DamageSpell,ChangeStatSpell等。

问题是技术性的 - 在DamageSpell类中 - 在声明损坏方法之后 - 它说它找不到getSpell(java无法找到符号:方法getSpell()。我该如何修复这个?我很感激一个代码示例,它描述了如何修复它。谢谢。

abstract public  class Spell {
    private String name;
    private int spellLevel;
    private int manaCost;

    Spell(String name, int spellLevel , int manaCost){
        this.name = name;
        this.spellLevel = spellLevel;
        this.manaCost = manaCost;
    }


    String getSpellName(){ return name; }
    int getSpellLevel() {return spellLevel; }
    int getManaCost(){ return manaCost; }
}

public class DamageSpell extends Spell {

private int n;
private int dice;
private int base;
private int stepLevel;
private int maxCasterLevel;


DamageSpell(String name, int spellLevel, int manaCost, int n, int dice, int base, int stepLevel, int maxCasterLevel){
    super(name, spellLevel, manaCost);
    this.n = n;
    this.dice = dice;
    this.base = base;
    this.stepLevel = stepLevel;
    this.maxCasterLevel = maxCasterLevel;
}


static List<DamageSpell> damageSpellsList = new ArrayList<DamageSpell>();

static
{
    damageSpellsList.add(new DamageSpell("Magic Missiles", 1, 2,   1, 4, 1, 2, 9));
    //  damageSpellsList.add(new DamageSpell("Scorching Ray ", 2, 4));
    damageSpellsList.add(new DamageSpell("Fireball", 3, 6,   1, 6, 1, 1, 10));
    //damageSpellsList.add(new DamageSpell("Ice Storm", 4, 8));
}





public static void damage(String spellName, Character attacker, Character target){


    DamageSpell spell = damageSpellsList.getSpell(spellName);

    int damage = 0;

    int casterLevel = Math.min(attacker.getLevel(), spell.maxCasterLevel);
    int totalRolls = (casterLevel-spell.base)%spell.stepLevel;

    for (int i = 1; i <= totalRolls ; i++) {
        damage += DiceRoller.roll(spell.n, spell.dice);

    }

    target.setCurrentHp(target.getCurrentHp() - damage);
    System.out.println(" You dealt " + damage + " to the enemy");

}

public DamageSpell getSpell(String spellName) {
    try {
        for (Iterator<DamageSpell> iter = damageSpellsList.iterator(); iter.hasNext(); ) {
            DamageSpell spell = iter.next();
            if (spellName.equals(spell.getSpellName())) {
                return spell;
            }
        }

    } catch (Exception e){
        System.out.println(spellName + " haven't been found in spells-list");
        return null;
    }
    return null;

}

}

2 个答案:

答案 0 :(得分:0)

您在您的damageSpellsList变量上调用getSpell(...),该变量是一个ArrayList,当然不会有该方法。您需要在List中的元素上调用它,而不是在List本身上调用它。但话虽如此,我看到你的方法体仅使用静态元素,所以也许getSpell(...)方法也应该是静态的并且在DamageSpell类上调用。我不确定我喜欢这个设计,也许List应该是非静态的并且保存在它自己的类中。

对于类似的问题,请始终发布您所看到的完整错误消息。

建议:

  • 考虑创建一个SpellBook类
  • 在此课程中,请使用非静态List<Spell>
  • 如果您只通过名称字符串获得拼写,那么该集合不应该是List / ArrayList,而应该是HashMap<String, Spell>,这样可以更容易地按名称检索该拼写。
  • 为此课程提供public Spell getSpell(String name)方法
  • 当法术持有者决定使用或“施放”他的法术时,法术类可能需要cast(owner, target)方法。

答案 1 :(得分:0)

您的getSpell(&#34;&#34;)问题非常简单。您正在执行damageSpellsList.getSpell(spellName);damageSpellsListList<T>,并且列表中没有getSpell()方法(或任何常规集合)。

您需要做的是使用Object访问列表存储在List<T>的特定索引处的List#get(i),或完全迭代List使用for循环或Iterator