【问题标题】:Save different class instances in a list在列表中保存不同的类实例
【发布时间】:2013-12-29 20:57:50
【问题描述】:

我有一个一般性的 Java 问题。

我有不同的“法术”类,它们不是由 1 个对象组成的,因为它们差异太大。 所以我创建了例如 3 个类:

  1. Ice ice = new Ice();
  2. Hurricane hurricane = new Hurricane();
  3. Bomb bomb = new Bomb();

这些法术确实有相同的对应方法(getCooldown()getName()cast())。

所以我希望将这些类实例保存在某个list/hashmap 中,我可以在其中进行迭代。在遍历实例时,我会检查 getName() 是否等于某个名称,如果是,则返回某个类实例。

我希望这是可能的,如果不是我希望有人可以帮助我考虑另一个想法。

【问题讨论】:

    标签: java class interface instances


    【解决方案1】:

    您可以让所有三个类都实现一个通用接口并声明该列表以包含该接口的实例。

    interface Spell {
        int getCooldown();
        String getName();
        void cast();
    }
    
    public class Ice implements Spell {
        @Override
        public int getCooldown() { . . . }
        @Override
        public String getName() { . . . }
        @Override
        public void cast() { . . . }
        // more stuff specific to Ice
    }
    public class Hurricane implements Spell {
        // similar to above
    }
    

    然后你可以这样做:

    List<Spell> spells = new ArrayList<>();
    
    spells.add(new Hurricane());
    spells.add(new Ice());
    

    您也可以使用通用基类来做到这一点,但对接口进行编码通常会提供更大的灵活性。

    【讨论】:

    • 常规类继承也适用于这种情况,特别是如果 OP 有共同的代码。冷却机制之类的东西不应该重新实现。
    • @Radiodef - 处理该问题并保持对接口进行编码的好处的典型方法(参见herehere)是在实现接口的基类中实现通用操作.它需要更多的编码,但极大地简化了类结构的测试和未来的演变。
    【解决方案2】:

    尝试实现一个它们都派生自的接口或基类,然后创建一个包含该接口或基类的列表。

    【讨论】:

    【解决方案3】:

    定义具有getCooldown()getName()cast() 方法的接口。然后让所有类实现该接口。现在创建如下列表并添加到其中:

    List<MyInterface> list = new ArrayList<MyInterface>();
    

    【讨论】:

      【解决方案4】:

      为你的所有法术创建一个基本的抽象类或接口,例如:

      public abstract class Spell {
      
          public abstract int getCooldown();
      
          public abstract String getName();
      
          public abstract void cast();
      }
      

      现在让你的法术扩展Spell 类。然后像这样创建你的List

      List<Spell> spells = new ArrayList<>();
      

      现在您可以将任何Spell 添加到spells 列表中。

      【讨论】:

      • 当您必须重写每个方法时,抽象类并不是很有用。当您想要定义通用行为或提供通用实现时,您可以使用它。当您只需要一个通用定义时,那就是您使用接口的时候。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多