接口实现可比?

时间:2013-04-21 13:54:23

标签: java comparable

我们是一对设计游戏的朋友。在我们的游戏中,我们让所有敌人都实现了Combatable界面,让实施者决定他们如何进行战斗,这使得不同种类的敌人的加入非常容易。我们(我们正处于测试阶段)是一个炮塔,如果敌人在射程范围内,则每秒射击最近的敌人。

我们想以某种方式让这个接口实现Comparable<Combatable>,以便我们可以按照距离塔的距离对我们的集合进行排序,这样我们只需要检查集合中的第一个元素是否在攻击范围内。我们意识到一个简单的解决方案是创建一个可战斗的包装类,除了实现Comparable之外什么也不做,但我们真的必须这样做吗?我意识到想到一个实现另一个接口的接口没什么意义,但除此之外,它对于这个特定用途来说非常方便。

3 个答案:

答案 0 :(得分:3)

界面不能实施其他界面,但它可以扩展任意数量的其他界面。

只做

interface Combatable extends Comparable<Combatable> {

答案 1 :(得分:2)

接口扩展了另一个接口,但没有实现它,因为接口不包含实现。所以你可以扩展可比性。

答案 2 :(得分:1)

  • 使用接口定义类型。

  • 创建一个新的类型(可衡量的),用于定义可以在塔中排序的东西(或者如果它的超类型如建筑),则可以排序。

  • 然后让您的 Enemy 类实现 Combatable 可衡量接口。 现在你的敌人是可以排序的w.r.t.塔。
  • 写下你的新比较器,对敌人进行分类w.r.t.塔位。

interface Measurable { 

   // Compute the distance from a turret.
   // It would be better if you use a superclass of Turret to make your method more general
   double distance(Turret p);

};

class Enemy extends Measurable, Combatable {
};

class Turret {

  ...

  Position pos() { return pos; }

  boolean isInRange(Combatable c) { ... }

  void hit(Combatable combatable) { ... }

};



DistFromTurretComparator implements Comparable<Enemy> { 

  DistFromTurretComparator(Turret turret) { 
      this.turret = turret;
  }


  private int compareTo(Enemy other) {
      int dist = distance(turret);
      int oDist = other.distance(turret);

      return  dist > oDist ? + 1 : (dist < oDist ? -1 : 0);
  }

  private final Turret turret;

};

// Main
Tower tower = new Toweer(); 
List<Combatable> enemies = new ArrayList<>(Arrays.asList(enemy1, enemy2, ...));

Collections.sort(enemies, new DistFromTurretComparator(tower));
Enemy nearestEnemy = enemies.get(0);


if (tower.hasInRange(enemy)) {
    tower.hit(enemy);
}