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
  • インターフェースを使用してタイプを定義します。

  • タワー (またはBuildingなどのスーパータイプの場合は 1 つ) の位置に関してソート可能なモノを定義する新しいタイプ(Measurable) を作成します。

  • 次に、EnemyクラスにCombatableおよびMeasurableインターフェースを実装させます。今、あなたの敵はソート可能な wrt タワーです。
  • 敵をタワーの位置でソートする新しいコンパレータを作成します。

.

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 に答える