2013-04-21 78 views
0

我們是幾個設計遊戲樂趣的朋友。在我們的遊戲中,我們讓所有敵人都實現了一個Combatable接口,讓執行者決定他們如何進行戰鬥,這使得各種敵人的加入變得非常容易。我們有(我們正處於測試階段)一個炮塔,如果敵人在範圍內,它就會每秒向最近的敵人射擊。接口實現可比?

我們想以某種方式讓這個接口實現Comparable<Combatable>,這樣我們就可以按照距塔的距離排序我們的集合,所以我們只需要檢查集合中的第一個元素是否在攻擊範圍內。我們意識到一個簡單的解決方案是創建一個可執行文件的包裝類,除了執行Comparable之外別無其他,但是我們真的必須這麼做嗎?我意識到想到一個實現另一個接口的接口是沒有意義的,但是除了這個特定的使用方法之外,它是非常方便的。

回答

3

一個接口不能實現另一個接口,但它可以擴展任何數量的其他接口。

只是做

interface Combatable extends Comparable<Combatable> { 
+0

謝謝,我想這是有道理的,有時候大腦往往會浮現出答案,但排序是我們第一次開始設計時沒有想到的東西。現在我們必須實現在每個類中100%相同的方法:d – arynaq 2013-04-21 14:00:09

+0

@arynaq:聽起來像您可以使用抽象類作爲基礎。 – Keppil 2013-04-21 14:01:42

2

接口擴展另一個接口,但沒有實現它,因爲接口不包含實現。所以你可以延伸可比。

1
  • 使用接口來定義類型。

  • 創建一個新的的(Measurable)定義的東西,可排序w.r.t塔(或一個,如果它的超類型,例如大廈)的位置。

  • 然後讓你的敵人的implemet 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); 
} 
+0

感謝您花時間寫出詳細的答案,我們最終可能會這樣做。 – arynaq 2013-04-21 15:15:25

+0

@arynaq:不客氣:) – user278064 2013-04-21 15:19:27