【问题标题】:How do I define multiple implementations for a method?如何为一个方法定义多个实现?
【发布时间】:2012-08-09 03:09:18
【问题描述】:

只是为了玩一点,我正在尝试通过命令行制作一个由两名玩家组成的回合制战斗游戏。每个玩家控制一个怪物,最多有 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

【问题讨论】:

    标签: java design-patterns inheritance


    【解决方案1】:

    你可以为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),但这取决于所有移动是否共享您想要子类化的某种通用功能(第一种方法,带有超类)或者,如果 Moves 也可以是其他东西,您只需要 performOn(Monster) 方法签名。例如,如果你有类似武器的东西,它有一个移动:

    public class FancyWeapon extends Weapon implements Move
    {
    
    }
    

    【讨论】:

    • 所以你建议为每个动作创建一个类?
    • @lancex 我不知道你是如何组织一切的,但你还会把功能放在哪里来执行特定的移动?
    • 我在想也许我可以定义一个方法的实现,并在创建它时将其传递给 Move,方法是... Move move = new Move(){ public int perform( Monster m){ ..implementation.. } } 虽然我不完全确定这样的事情实际上做了什么......
    • @lancex 使用这样的匿名类是为即时完成的事情或一次性使用的场景而保留的。如果您打算重用(例如,monster1 可以使用 Firebreath,后来 monster2 可以使用 Firebreath),最好将该代码放在公共类中,其他类可以公开引用它。如果您想在代码中的多个位置使用 Move,匿名类是糟糕的方法。
    • @lancex 您所描述的是创建匿名内部类。最好有如上所述的实际类,因为它们可以重复使用。
    【解决方案2】:

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

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

    那个例子,然后你会创建一系列的类: public class BreatheFire implements Move { @Overrides public void performOn(Object o) { .... } }.

    希望有帮助!

    【讨论】:

      【解决方案3】:

      你可以有一个 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);
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-28
        • 2017-06-30
        • 1970-01-01
        • 1970-01-01
        • 2017-12-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多