2015-11-01 40 views
-2

我有一个名为Spell的抽象类。技能类假设有几个子类,比如DamageSpell,ChangeStatSpell等。Java - 列表和方法

问题是技术性的 - 在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; 

} 

} 

回答

0

你的getSpell(“”)问题很简单。您正在做damageSpellsList.getSpell(spellName);,damageSpellsListList<T>,并且列表没有getSpell()方法(或任何常规集合)。

你将要做的是使用List#get(i)或在List迭代完全使用一个for循环或Iterator访问列表被存储在List<T>的某一指数Object

+0

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

0

你在打电话getSpell(...)描述如何解决由于一个代码示例你。这是一个ArrayList的damageSpellsList变量,以及哪个当然不会有这种方法。你需要在List中的一个元素上而不是在List上调用它。但话虽如此,我发现你的方法体只使用静态元素,所以getSpell(...)方法也应该是静态的,并且调用DamageSpell类。我不确定我是否喜欢这个设计,也许这个List应该是非静态的,并且是在它自己的类中。

也对于类似的问题,总是发布你看到的完整的错误信息。


建议:

  • 考虑创建一个魔法书类
  • 在这个类中,有一个非静态List<Spell>
  • 如果你将只能得到按名称字符串拼写,然后收集应不是一个List/ArrayList,而应该是一个HashMap<String, Spell>,这使得通过名称检索法术变得更容易。
  • 给这个类中的方法public Spell getSpell(String name)
  • 也许法术类需求时拼写持有人决定使用或“中投”他的法术cast(owner, target)方法。
+0

设计是坏的,如果你有一个想法如何改善它,那么不要犹豫:) – Niminim

+0

@Niminim:看编辑。和同上。 –

+0

魔法书可以是Mage的列表。当我只有魔法类型的MageSpellsList有问题时,这里的人们建议使用静态。我应该怎么做? – Niminim