【问题标题】:Java - Lists and methodsJava - 列表和方法
【发布时间】:2015-11-01 16:01:38
【问题描述】:

我有一个名为 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;

}

}

【问题讨论】:

    标签: java oop


    【解决方案1】:

    你的 getSpell(" ") 问题很简单。你正在做damageSpellsList.getSpell(spellName);damageSpellsList 是一个List&lt;T&gt;,而列表没有getSpell() 方法(或任何一般的集合)。

    您需要做的是使用List#get(i) 或完全使用for 循环或@987654329 遍历List 来访问列表存储在List&lt;T&gt; 的某个索引处的Object @。

    【讨论】:

    • 哦,我错过了一些东西。在我的文件的前一个版本中,另一个类使用了在 mageSpellsList 上运行的 MageSpellsList.getSpell(),所以我没有问题。我复制了它,并更改了几个字母,但我没有注意到一个名为 getSpell 的类,这里是一个列表。傻我:)
    【解决方案2】:

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

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


    建议:

    • 考虑创建一个 SpellBook 类
    • 在这个类中,有一个非静态的List&lt;Spell&gt;
    • 如果您只获取 Spell by name String,那么集合不应该是 List/ArrayList 而应该是 HashMap&lt;String, Spell&gt;,这样可以更容易地按名称检索拼写。
    • 给这个类一个public Spell getSpell(String name)方法
    • 当 Spell 持有者决定使用或“施放”他的法术时,或许 Spell 类需要一个 cast(owner, target) 方法。

    【讨论】:

    • 这个设计很糟糕,如果你知道如何改进它,那就不要犹豫了:)
    • Spellbook 可以是 Mage 拥有的列表。当我只有 Spell 类型的 MageSpellsList 时,我遇到了问题,这里的人们建议使用静态。我该怎么做?
    • 使用 HashMap 需要强制转换才能执行操作? (因为 Spell 有部分数据)。你的意思是法术书将是一个哈希图,对吧?
    • 公共拼写 getSpell(字符串名称)。 - 为什么返回法术而不是伤害法术更好?
    • 关于 - 在这个类中,有一个非静态列表 - 这个列表将包含 Spell 类型的对象,这意味着它不会包含 DamageSpell 的字段及其相关数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多