0

我们是几个朋友设计一个有趣的游戏。在我们的游戏中,我们让所有敌人都实现了一个Combatable接口,让实现者决定他们想要如何进行战斗,这使得添加不同种类的敌人变得非常容易。我们有(我们正处于测试阶段)一个炮塔,如果该敌人在射程内,它会每秒向最近的敌人射击。

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

4

3 回答 3

3

一个接口不能实现另一个接口,但它可以扩展任意数量的其他接口。

做就是了

interface Combatable extends Comparable<Combatable> {
于 2013-04-21T13:55:57.667 回答
2

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

于 2013-04-21T13:57:30.847 回答
1
  • 使用接口来定义类型。

  • 创建一个新类型(Measurable),定义可在塔(或如果其超类型,例如Building)位置排序的事物。

  • 然后让你的Enemy类实现CombatableMeasurable接口。现在你的敌人是可分​​类的塔。
  • 编写新的比较器,将敌人与塔的位置进行分类。

.

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);
}
于 2013-04-21T14:48:51.727 回答