如何为方法定义多个实现?

时间:2012-08-09 03:09:19

标签: java design-patterns inheritance

只是为了玩一下,我试图通过命令行与两名玩家进行回合制战斗游戏。每个玩家控制最多4个不同动作的怪物。我已经定义了Monster和Move类来定义不同的怪物和动作。当玩家使用移动时,我想我想在移动中调用类似performOn(Monster mon)的方法。在那个方法中,我想定义移动的实现,因为不是每个移动都会做同样的事情。我很确定Java可以做到这一点,但我不完全确定它是如何完成的。对于Monster和Move类,我有一个内部Builder类来避免使用大型构造函数方法。如果有人对如何进行移动有更好的了解,请随时分享。 :)

谢谢!

示例:

// moves is a HashMap<String, Move>
monster1.moves.get("Firebreath").performOn(monster2); // damages monster2
monster2.moves.get("Heal").performOn(monster2); // heals monster2

3 个答案:

答案 0 :(得分:2)

你可以为Move创建一个超类,所有特殊动作都可以扩展它:

public abstract class Move
{
    public abstract void performOn(Monster m);
}

然后延伸:

public class FirebreathMove extends Move
{
    public void performOn(Monster m)
    {
         // do something to Monster
    }
}

或者你可以创建一个界面:

public interface Move
{
    public void performOn(Monster m);
}

你的动作可以实现它:

public class FirebreathMove implements Move
{
    public void performOn(Monster m)
    {
         // do something to Monster
    }
}

在任何一种情况下,您都可以引用Move来引用performOn(Monster),但这取决于所有移动是否共享某些您想要子类化的常用功能(第一种方法) ,使用超类)或者如果Move也可以是其他内容,您只需要performOn(Monster)方法签名。例如,如果你有类似武器的东西,那就有一个移动:

public class FancyWeapon extends Weapon implements Move
{

}

答案 1 :(得分:1)

我不确定这是不是你的意思,但interface可能是你想要的?

界面如下所示: public interface Move() { void performOn(Object o); String getMoveName(); }

那个例子,你会做一系列的课程: public class BreatheFire implements Move { @Overrides public void performOn(Object o) { .... } }

希望有所帮助!

答案 2 :(得分:1)

你可以有一个Move父类(或接口),所以它的工作原理类似于此。

public interface Move{
  public void performOn(Monster m);
}

public Firebreath implements Move{
  public void performOn(Monster m)
  {
    m.takeFireDamage(5);
  }
}

public Heal implements Move{
  public void performOn(Monster m)
  {
    m.healDamage(5);
  }
}