我们是一对设计游戏的朋友。在我们的游戏中,我们让所有敌人都实现了Combatable
界面,让实施者决定他们如何进行战斗,这使得不同种类的敌人的加入非常容易。我们(我们正处于测试阶段)是一个炮塔,如果敌人在射程范围内,则每秒射击最近的敌人。
我们想以某种方式让这个接口实现Comparable<Combatable>
,以便我们可以按照距离塔的距离对我们的集合进行排序,这样我们只需要检查集合中的第一个元素是否在攻击范围内。我们意识到一个简单的解决方案是创建一个可战斗的包装类,除了实现Comparable
之外什么也不做,但我们真的必须这样做吗?我意识到想到一个实现另一个接口的接口没什么意义,但除此之外,它对于这个特定用途来说非常方便。
答案 0 :(得分:3)
界面不能实施其他界面,但它可以扩展任意数量的其他界面。
只做
interface Combatable extends Comparable<Combatable> {
答案 1 :(得分:2)
接口扩展了另一个接口,但没有实现它,因为接口不包含实现。所以你可以扩展可比性。
答案 2 :(得分:1)
使用接口定义类型。
创建一个新的类型(可衡量的),用于定义可以在塔中排序的东西(或者如果它的超类型如建筑),则可以排序。
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);
}