我是Java的新手,我目前正在学习抽象类。目前我正在创建一个简单的RPG。假设我有一个名为Person
的抽象类,它扩展到另外两个类Warrior
和Wizard
。
现在假设我有另一个名为Weapon
的抽象类,从那里我们可以创建不同类型的武器(剑,轴,弓等),它们共享一些基本方法,可以被其他继承的方法覆盖类,例如attack()
或maintenance()
。
当Person
(Wizard
或Warrior
)在游戏中的某个时刻调用attack()
方法时,我需要知道谁将成为攻击者以及谁防守者(表明我可以修改他们的生活栏状态,武器的耐久性等)。
(这实际上意味着,在attack()
方法中接收两个对象作为参数)。
所以这就是我被困住的地方。攻击者 - 防御者的组合可以是Wizard-Warrior
,Wizard-Wizard, Warrior-Wizard or Warrior-Warrior
。
我应该如何在attack()
类中实现Weapon
方法,以便它可以允许我接收一个对象作为参数,而不关心对象是向导还是战士?这有可能吗?
void attack(Person attacker, Person defender)
{
// add method logic here
}
提前致谢。
答案 0 :(得分:2)
没有真正回答这个问题,但为什么不将attack
移到Person
班级,然后你可以把它写出来像
class Person
public void attack(Person target, int damage) {
target.setLife(life - damage);
// or target.damage(damage), or however else you want to implement that
...
}
然后
myWarrior.attack(evilWizard, myWeapon.getDamage);
这似乎对我更有意义,因为Person
将会进行攻击。
答案 1 :(得分:0)
很容易,巫师和战士需要扩展人
公共类战士扩展人{ }
这很容易。
然后你可以查看它是什么......
if(例如,Warrior攻击者)。
答案 2 :(得分:0)
第一步,从Wizard
派生Warrior
和Person
(您可以考虑将Person设为接口)。
第二步,根据Person实现attack(Person attacker, Person defender)
,而不是Warior或Wizard。 Warrior和Wizard常用的所有方法应该可供人使用。任何不常见的方法都应与attack()
无关。
例如,如果向导具有castBestSpell(Person target)
方法,而Warrior具有hitWithWeapon(Person target)
,则需要将这两种方法都缩减为Person.attack(Person target)
。向导和战士将以不同方式实施attack(Person target)
:一个致电castBestSpell
,一个致电hitWithWeapon
。
答案 3 :(得分:0)
我想提出另一种选择:
您已声明attack
类位于Weapon
类,但似乎此方法在Person
类中更合乎逻辑的位置。如果我们用具体的术语来思考它,那就是攻击对手的武器,而不是攻击对手的Person
武器。
在没有看到游戏设计的情况下很难给出具体的答案,但是我会假设你的Person
维护一个target
字段,指向这个{{1}的目标对象对象。
此外,当玩家受到攻击时,他们无疑会#34;捍卫"他们自己以某种方式(例如,这可能仅仅是因为盔甲造成的减轻伤害,或者某些活动能力或动作)。
所以你的课程看起来像这样:
Person
这个例子假设你的游戏是如何工作的,但正如我所说,它只是一个例子,并希望能够说明一种更好的方法来实现游戏逻辑,而不是在知道具体的public abstract class Person {
private Person target;
private Weapon weapon;
public void attack(){
target.defend(calculateRawDamage());
}
private int calculateRawDamage(){
// calculate weapon damage plus any modifiers, etc.
}
public void defend(int rawDamage){
// calculate actual damage based on damage-mitigation modifiers
}
}
时回复或Person
类型,因为由于多态性,每个对象将根据其具体类型以自己的专用方式运行。