gpt4 book ai didi

java - Java:在自己的方法中引用类

转载 作者:行者123 更新时间:2023-12-01 18:10:04 25 4
gpt4 key购买 nike

我正在做一个正在尝试调试的任务。我有很多error: (method name) in class (SuperClass Name) cannot be applied to given types;。该项目正在将针对过程编程的游戏改用于同一游戏,但现在针对OOP。我是Java的新手,并负责创建许多类,其中有两个是Superclass的子类(很明显),并且已为我提供了什么方法及其参数。我遇到的问题是子类中的一种方法应该控制两个角色(玩家和敌人)之间的战斗。这两个类都是字符类(超类)的子类。由于这是班级作业,因此我不想发布所有内容,但以下是我尝试执行的战斗方法的示例。我一直遇到的问题,以及与“继承性”有关的问题,仍然是父/子类之间继承的,以及如何在每个子类之间传递某些值/变量。

在下面的示例代码中,此方法嵌套在扩展Player类的Character类中。此方法需要使用Enemy类中的敌人并执行其中的操作。根据结果​​,我将布尔值传递回程序的main方法。

我的问题是我不确定在本示例中如何在已经包含在“ 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;
}
}


请记住,这是子类( Player)中的一种方法,与该子类( Enemy)大致具有相同的方法,仅此一个和其他几个方法相同。

根据上面的代码,这是我的具体问题:


方法 battleWizard中的第6行(注释中的#1问题)-由于此方法位于 Player类中,我可以通过这种方式引用 Enemy类吗?如果没有,有什么更好的方法?
方法 battleWizard中的第12行(注释中的#2问题)-当方法(代码示例)在类本身中时,如何引用以其自己的名称创建对象的类?我想接受最终用户的播放器 player并在自身内部引用该对象,如果这有意义吗?我试图可视化编译器将如何执行此任务,并且无法想象这种工作方式。
从底部开始的13行(注释中的#3问题参考):
a)您可以将一个方法作为参数传递给Java中这样的另一个方法吗?
b)像这样调用另一个子类(与调用该类的子类相同的子类)的正确方法是可能的吗?


感谢您的帮助。如前所述,由于这是一个类分配,所以我不想提供更多代码示例。但不可避免的是,如果这有助于我理解,我会。请让我知道您需要什么进一步的信息。

预计到达时间:
我添加了其他代码来描述父类和子类之间的关系。对于 Enemy子类,攻击方法依赖于 Character超类。因此,在上面的代码示例中,我希望它能阐明3.b。我的问题。需要任何其他信息,请让我知道。

最佳答案

由于定义了attack(Player _player),这意味着您仅允许传递Player对象,但是您正在使用类似Player.attack(_enemy)的方法,这意味着传递Enemy对象,从而导致编译错误。

您需要更正此问题。阅读我的段落“放在一边……”。


  方法warWizard中的第6行(注释中的#1问题)-自此
  方法驻留在Player类中,我可以在其中引用Enemy类吗
  这边走?如果没有,有什么更好的方法?


根据您的代码示例,int updWizHP = _enemy.getHitPoints();是一个有效且明智的调用,如果您想获取敌人的生命值。 _enemy是您的Enemy对象,您可以在其上使用任何方法,只要该方法存在于该类中即可。


  方法warWizard中的第12行(注释中的#2问题)-我该如何
  引用一个类时,该类使用自己的名称创建了一个对象
  方法(代码示例)是否在类本身中?我想拿
  最终用户的播放器播放器,并在其自身内引用该对象(如果有)
  这就说得通了?我试图形象地看一下编译器将如何
  执行此任务,无法想象它会一直工作。


由于Player扩展了Character,因此您将在attack类中继承Player方法(可视化为在attack类中定义Character方法)。因此,您实际上不需要使用updWizHP = Player.attack(_enemy);,而只需使用updWizHP = attack(_enemy);。但是,这是一个编译错误,请阅读答案的第一部分和最后一部分。

现在,由于attack方法未使用Player类的任何实例字段(Player类的状态),因此您不必担心,但是如果是这样,则必须考虑并决定在哪个Player您要调用attack方法的类对象。


  从底部开始的13行(注释中的#3问题参考):a)您可以
  将方法作为参数传递给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的某些子类。

那就是“继承”和“程序到接口”的美。我建议您搜索并了解这两个概念。


可能没有您注意到的快速注释(这些是试图公开主题/概念的一般性注释,可能会有更多限制行为,因此请阅读每个主题/概念的更多信息):


对象是类的运行时表示。
父类的方法由子类继承,如果要从同一个类进行调用,则无需使用对象即可调用它们。将其可视化为在同一类中定义该方法(有关上下文的更多信息,请参见上下文公共v / s受保护的v / s私有方法)。
您可以覆盖继承的方法。
可以使用其任何子类的对象调用接受超类型的方法。例如,在您的情况下,giveMeAnyCharacter(Character char)可用作giveMeAnyCharacter(new Person())giveMeAnyCharacter(new Enemy())
在Java中,this表示当前对象或实例,而super表示超类。因此,或者创建一个新对象,或者如果您想使用与您正在工作的对象相同的对象,请使用this
始终将所有通用代码(方法或实例字段)放在超类中,并让子类通过继承利用它。

关于java - Java:在自己的方法中引用类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33714114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com