接收从抽象类派生的对象作为方法中的参数

时间:2014-10-30 19:56:54

标签: java abstract-class

我是Java的新手,我目前正在学习抽象类。目前我正在创建一个简单的RPG。假设我有一个名为Person的抽象类,它扩展到另外两个类WarriorWizard

现在假设我有另一个名为Weapon的抽象类,从那里我们可以创建不同类型的武器(剑,轴,弓等),它们共享一些基本方法,可以被其他继承的方法覆盖类,例如attack()maintenance()

PersonWizardWarrior)在游戏中的某个时刻调用attack()方法时,我需要知道谁将成为攻击者以及谁防守者(表明我可以修改他们的生活栏状态,武器的耐久性等)。

(这实际上意味着,在attack()方法中接收两个对象作为参数)。

所以这就是我被困住的地方。攻击者 - 防御者的组合可以是Wizard-WarriorWizard-Wizard, Warrior-Wizard or Warrior-Warrior

我应该如何在attack()类中实现Weapon方法,以便它可以允许我接收一个对象作为参数,而不关心对象是向导还是战士?这有可能吗?

例如,做这样的事情?

void attack(Person attacker, Person defender)
{
    // add method logic here

}  

提前致谢。

4 个答案:

答案 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派生WarriorPerson(您可以考虑将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类型,因为由于多态性,每个对象将根据其具体类型以自己的专用方式运行。