2015-11-14 60 views
0

我正在處理一個當前正在嘗試調試的任務。我有很多error: (method name) in class (SuperClass Name) cannot be applied to given types;。該項目將圍繞Procedural編程的遊戲重新設計爲同一款遊戲,但現在圍繞OOP。我是Java新手,並且負責創建許多類,其中兩個是超類的子類(顯然),我已經給出了具有哪些方法以及它們的參數。我遇到的問題是,一個子類中的一個方法應該控制兩個角色之間的戰鬥,即玩家和敵人。這兩個類都是字符類(超類)的子類。由於這是一個班級任務,我不想發佈我擁有的所有東西,但下面是我嘗試執行的戰鬥方法的一個例子。我遇到,並繼續在總體上具有「繼承」,問題是究竟什麼是父/子類,以及如何通過他們每個人之間存在一定的值/變量之間的繼承。Java:在自己的方法中引用一個類

在下面的示例代碼中,此方法嵌套在擴展Character類的Player類中。該方法需要使用Enemy類中的敵人並執行其中的動作。根據結果​​,我將布爾值傳回給我的程序的主要方法。

我的問題是這樣的;我不確定如何在「Player」類下包含的方法中調用已在此示例中創建「Player」類的類。當被調用時,我被要求使用一個參數作爲參數,Enemy。我確信我沒有以適當的方式接近這個特定的任務,並且有更好的方法來解決這個問題。但任何幫助理解什麼是可能的是非常感謝,因爲它會幫助我以正確的方式處理這項任務。從Player

抽樣方法如下:

public abstract class Character{ //Character Superclass - attack method called 

public int attack(Player _player){ 
    Random randomNumbers = new Random(); 
    int enemyRandAtk = randomNumbers.nextInt(Weapon.getMaxDamage - Weapon.getMinDamage) + Weapon.getMinDamage; 
    int enemyAtk = enemyRandAtk + getStrength(); 
    int charRemainingHP = _player.getHitPoints() - enemyAtk; //can I call _player in the Character class???? 
    System.out.printf("%s attacks with ATK = %d + %d = %d\n", getName(), getStrength(), enemyRandAtk, enemyAtk); 
    System.out.printf("%s HP is now %d - %d = %d\n\n", _player.getName(), _player.getHitPoints(), enemyAtk, charRemainingHP); 
    return charRemainingHP; 
} 

public class Player extends Character{ 


    public int attack(Enemy _enemy){ 
    Random randomNumbers = new Random(); 
    int enemyHP = _enemy.getHitPoints(); 
    int charRandAtk = randomNumbers.nextInt(Weapon.getMaxDamage - Weapon.getMinDamage) + Weapon.getMinDamage; 
    int charAtk = charRandAtk + getStrength(); 
    int enemyRemainingHP = _enemy.getHitPoints() - charAtk; 
    System.out.printf("\n\n%s attacks with ATK = %d + %d = %d\n", getName(), getStrength(), charRandAtk, charAtk); 
    System.out.printf("%s HP is now %d - %d = %d\n\n", _enemy.getName(), enemyHP, charAtk, enemyRemainingHP); 
    return enemyRemainingHP; 
    } 
    public boolean battleWizard(Enemy _enemy){ 
    Random randomNumbers = new Random(); 
    Scanner userInput = new Scanner(System.in); 
    int spellCast = randomNumbers.nextInt(4) + 1; 
    System.out.printf("*** %s vs The Evil Wizard ***\n\n", getName()); //getName() is in Player Class 
    boolean charWinning = false; 
    int updWizHP = _enemy.getHitPoints(); //****** Question 1. below 
    do{ 
     System.out.print("Choose your action: \n" + 
         "1. Attack\n" + 
         "2. Attempt Spell Cast\n\n" + 
         "What would you like to do?: "); 
     int battleDecision = userInput.nextInt(); 

     if (battleDecision == 1){ 
      updWizHP = Player.attack(_enemy); //**** Question #2 Below 
      if (updWizHP <= 0){ 
       charWinning = true; 
       break; 
      } 
     }else if(battleDecision == 2){ 
      System.out.print("Enter your guess: "); 
      int playerGuess = userInput.nextInt(); 
      if (playerGuess == spellCast){ 
       System.out.printf("The %s's spell is cast successfully! The Wizard's HP is now 0!\n\n", getName()); 
       charWinning = true; 
       updWizHP = 0; 
       break; 
      }else{ 
      System.out.print("Your spell missed the Wizard. Now he attacks!\n"); 
      } 
     } 
     if (getHitPoints() > 0){ 
      enemyDamage = Enemy.attack(); 
      decreaseHitPoints(_enemy.attack(Player)); \\**** Question #3 below 
      if (getHitPoints() < 0){ 
       charWinning = false; 
       break; 
      } 
     } 
    }while(getHitPoints() > 0 && _enemy.getHitPoints() > 0); 

    if (charWinning) 
     return true; 
    else 
     return false; 
    } 
    } 

請記住,這是一個擁有大致相同的方法(Enemy)總之這一個的子類(Player)內的方法和其他一些人。

在我的代碼在上文中,這裏是我的具體問題:

  1. 的方法battleWizard(在筆記#1題)6號線 - 由於此方法駐留在Player類,我可以引用Enemy這樣的課?如果沒有,那麼這樣做的更好方法是什麼?

  2. 行12在方法battleWizard(#2問題中註釋) - 當方法(代碼示例)在類本身中時,如何引用一個具有以其自己的名稱創建的對象的類?我想讓最終用戶的玩家player並在其內引用該對象,如果這有意義的話?我試圖想象編譯器將如何執行這個任務,並且無法想象這會工作。

  3. 13來自底部的行(注意#3問題參考): a)您可以將方法作爲參數傳遞給Java中的另一種方法嗎? b)是否像這樣調用另一個子類(與調用類的子類相同的子類)的正確方法還是甚至可能?

謝謝你的幫助。正如我之前提到的,由於這是一個班級任務,我不想提供更多的代碼樣本。但不可避免的是,如果它幫助我理解,那麼我會。請讓我知道你需要什麼進一步的信息。

ETA: 我添加了額外的代碼來描述super和子類之間的關係。對於Enemy的子類,它依賴於超類的Character攻擊方法。所以在我上面的代碼示例中,我希望它能澄清3.b.我的問題。任何進一步的信息,請讓我知道。

+3

理想情況下,不是向我們展示更多實際代碼,而是創建一個簡短但完整的示例來演示*只是*問題。你可以通過獲取真實代碼的副本,並刪除所有不相關的,一點一點的,確保你仍然有錯誤。它不需要做任何有用的事情 - 它只需要以我們可以複製的方式展示問題。 –

+1

因爲文本編輯器的格式和所有..告訴行號無法幫助..請評論代碼的東西像'#question1','#question3.a','#question3.b' ..你當前嘗試把代碼註釋是不是真的有幫助.. – hagrawal

+1

你不叫課堂。你調用方法。從其他方法調用它們是正常的。你的問題,或者至少你的頭銜,還不清楚。 – EJP

回答

2

因爲你定義attack(Player _player)你得到的編譯錯誤,這意味着你被允許只能傳遞Player對象,但您使用的是像Player.attack(_enemy)這意味着通過Enemy對象。

您需要糾正此問題。閱讀我的段落,「旁邊......」。

的方法battleWizard 6號線(在筆記#1問題) - 由於這 方法駐留在播放器類,可我引用 敵對階級這樣?如果沒有,那麼這樣做的更好方法是什麼?

根據你的代碼示例,如果你想獲得敵人的生命值,int updWizHP = _enemy.getHitPoints();是一個合理而且合理的調用。 _enemy是你的敵人對象,只要該方法存在於該類中,你就可以使用任何方法。

線12方法battleWizard(#2問題的說明) - 我怎樣才能 引用已物體在它自己的名字創建了一個類時, 方法(代碼示例)是在類本身?如果 有意義,我想採用 最終用戶的播放器播放器並在其內引用該對象。我試圖想象編譯器將如何執行此任務,並且無法想象這會工作。

由於Player被延伸Character,所以你將不得不在繼承類Player方法attack(可視化,這是如在Character類定義attack方法)。所以,你真的不需要使用updWizHP = Player.attack(_enemy);,但你可以簡單地使用updWizHP = attack(_enemy);。但是,這是一個編譯錯誤,請閱讀我的答案的第一部分和最後一部分。現在

,因爲attack方法不使用Player類(Player類的狀態)的任何實例字段,所以你不必擔心,但如果當年你不得不去思考和決定其上Player類對象你想打電話給你的attack方法。從底部

13號線(在筆記#3提問參考):1)你可以通過 的方法作爲參數在Java這樣的一種方法? b) 是調用另一個子類(與調用類的子類相同的子類級別)的正確方法,或者它甚至可能嗎?

  • 對於#3.A:使用decreaseHitPoints(_enemy.attack(Player));你不及格方法的另一種方法,但首先_enemy.attack(Player)將進行評估並作爲你的代碼int將返回和值將被傳遞到decreaseHitPoints
  • 對於#3.b:您沒有調用任何子類,但是您正在調用對象上的方法,如果對象表示的對象在繼承樹中表示的類或不是,則無關緊要。只有你需要確保它是一個邏輯調用,並且該方法存在於該類中。 我猜_enemy.attack(Player)會給你編譯錯誤,因爲你沒有定義Player作爲對象引用變量。你必須使用一些變量,不能像這樣使用類名。更好地利用_enemy.attack(this)


_enemy.attack(Player)這表明在攻擊方法,你想傳遞一個Player對象,現在要麼你用_enemy.attack(this)這意味着通過當前對象在其上battleWizard獲取調用(意義),或使用_enemy.attack(new Player())這意味着創建一個Player類的新對象並通過該類。


順便,我想你最好定義 public int attack(Player _player){public int attack(Character _character){,因爲這樣在將來你可以用 attack方法傳遞一個 Enemy對象或某些子類的 Character

這就是美「繼承」「程序到接口」。我會建議你搜索和了解這2個概念。


幾個簡單的音符爲你,可能是你會意識到( 這些都是試圖揭露話題/概念一般注意事項,可能會有更多限制的行爲,因此,請仔細閱讀每個主題/理念):

  • 對象是一個類的運行時表示。
  • 超類的方法被子類繼承,如果你是從同一個類調用的話,調用它們就不需要使用一個對象。將其視爲在同一類中定義該方法(瞭解有關上下文public v/s protected v/s私有方法中的繼承的更多信息)。
  • 您可以覆蓋繼承的方法。
  • 接受超類型的方法可以用其任何子類的對象調用。例如,您的情況giveMeAnyCharacter(Character char)可用作giveMeAnyCharacter(new Person())giveMeAnyCharacter(new Enemy())
  • 在Java中this表示當前對象或實例,而super表示超類。因此,要麼創建一個新的對象,要麼使用你正在展示的同一個對象,然後使用this
  • 始終將所有常用代碼(方法或實例字段)放在超類中,並讓子類使用繼承來利用它。
+0

優秀的迴應!非常感謝你。您的建議是否要求我爲超類中的所有變量輸入'this。(variable)',因爲您建議我在方法參數中使用'this'? – Pwrcdr87

+0

在Java中,'this'只是表示當前對象或當前實例。從邏輯上講,將'this'視爲當前上下文。當您說'_enemy.attack(Player)'時,這表示'attack'方法你想傳遞一個'Player'對象,現在要麼使用'_enemy.attack(this)'這意味着傳遞當前對象上的'battleWizard'被調用(有意義)或使用'_enemy.attack(新玩家) '這意味着創建一個'Player'類的新對象。 – hagrawal

+0

AHHHHHH。優秀!謝謝! – Pwrcdr87

1

因此,Java對於方法和字段(以及類也是)具有「可見性」,它定義了對其他類可見的內容。查找f.e. JLS 6.5.7.1-1,簡單的方法名稱和可見性。

但是,在你的情況下,「不能應用於給定的類型」意味着你傳遞的方法不同於簽名所說的不同的參數類型。

不過,對於問題2,您只需編寫this.attack(_enemy)或簡單地attack(_enemy)。 (順便說一句,下劃線是什麼?我希望它是來自轉換的神器,而不是你的風格指南中的東西)

問題3:只使用_enemy.attack(this)

順便說一句,你有你的面向對象術語混淆 - 一個通過類的實例。

+0

非常感謝您對Tassos的迴應。我相信我理解你的答案,並將根據你的建議進行工作。哦,下劃線僅僅是我的一種方法,在這種情況下將一個參數(比如'enemy')添加到方法中。當我這樣做時,我會在傳遞的參數之前加上一個下劃線來跟蹤事物,如果這有意義的話? – Pwrcdr87

1

你的問題還不太清楚,但我認爲問題在於你缺乏術語以及缺乏理解。我會嘗試一些指針你:

6號線的方法battleWizard - 由於此方法駐留在 Player類,我可以引用敵對階級以這種方式?如果沒有, 這樣做的更好方法是什麼?

int updWizHP = _enemy.getHitPoints(); //****** Question 1. below  

如果getHitPoints()是在Player類,你不能用一個Enemy實例調用它。字段和方法必須存在於調用中使用的實例的類中或其繼承樹(超類)中。

如果getHitPoints()既常見的兩種PlayerEnemy,你應該把常見的兩個最近的類中的方法 - 在你的情況,這將是Character類。把方法Character類(和給它保護公共可見性)允許它在這兩個PlayerEnemy類存在(並使用播放機的相關情況和敵人叫)

如何當方法(代碼示例)在類本身中時,我可以引用一個在其自己的 名稱中創建了對象的類嗎?

我所能想象到你這裏描述的唯一的事情就是關鍵字(你似乎沒有被使用在你的代碼)。 this代表你所在班級的當前實例。

所以使用this.attack(_enemy)是你如何獲得當前Player實例攻擊指定的敵人。

a)您是否可以將方法作爲參數傳遞給另一個方法,如 Java? b)是否像這樣調用另一個子類(與調用類的子類相同的子類 級別)的正確方法,還是甚至可能?

a)否。Java不允許將方法作爲參數傳遞。如果你想傳遞一個方法,你必須通過一個實例(包含該方法的類)作爲變量 - 比如說x - 然後調用你想要執行的方法爲x.method()。你在做什麼是調用方法並使用返回值作爲參數這是完全允許的。

decreaseHitPoints(_enemy.attack); // passing a method - not allowed 
decreaseHitPoints(_enemy.attack(Player)); // passing a return value from calling a method - OK 

b)我想你想要的是this.decreaseHitPoints(_enemy.attack(this));。是的,你可以(也應該)在其他類中調用方法 - 但是如果你的調用類是不相關的(即沒有從其繼承),只有在聲明爲public可見性時才能調用這些方法。

+0

我愛你,你的野蠻誠實! (燈泡從字面上剛剛在我腦海中消失)。我知道我的超類有'this。(variable)',但從來沒有真正理解它的含義。不要試圖拖拽評論/問題,但是我需要在超類中輸入this,還是可以將它輸入到任何子類中,並且this指向該子類的特定變量? – Pwrcdr87

+0

Java中不需要**,但是'this'可以並且應該在任何可以使用的地方使用。通過編寫'this',你明確地表明你的意圖是*指的是當前的班級實例,這個''這個詞在*裏面輸入。如果是在子類中使用'this',那麼就是指子類。如果你在超類中使用'this',你就是指超類。 – adelphus

+0

非常感謝您的澄清。現在我完全明白了 – Pwrcdr87

相關問題