2015-11-01 39 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