3

我了解到 Java 不允许在接口中使用实例字段,但我真的想要这个功能。

我正在学习创建我的第一个游戏。我的游戏有不同类型的演员,例如Hero(由玩家控制)Boss、、、Canon等...

无论它们是哪种类型,我都希望每个参与者都从基类继承,该基类Model将一些字段传递给它的子类,例如position,width并且height每个子类都Model可以与MVC 模式中的Controller和关联。Renderer

public class Model {
    //position
    public float x;
    public float y;

    public float width;
    public float height;
}

顺便说一句,我的意图是Hero并且Boss是可以死亡的实体,所以我希望它们Life是强制具有的实例,例如,public float hitPoint;作为一个字段,相比之下,aCannon不是 a Life,因为它将是一个不朽的实体。因此我尝试了:

public interface Life {
    public float hitPoint;
}

并期望一个实例

public class Hero extends Model implements Life {...}

本质上将具有hitPoint. 但是后来我了解到接口中的实例字段在 Java 中是不允许的,并且它也不支持多重继承。

是否有可能在 Java 中实现上述设计。

4

3 回答 3

2

只能在接口中声明常量。

如果值永远不会改变,那么您在接口中定义的任何内容始终是public static final(当然方法除外),那么此设计适合您。public abstracthitpoints

更好的解决方案是这个

public interface Life {
  //methods that implementation of this interface should implement
}

public abstract LifeForm extends Model implements Life {
  int hitPoints;
  //other LifeForm specific methods and instance variables
}

public Hero extends LifeForm {
  //Hero specific methods like save the damsel
}
于 2013-09-14T17:09:38.733 回答
1

Life将和声明Model为字段成员并根据每个所需的Actor实现更改它们的初始值和状态对您来说有意义吗?例如,将对象的life' 值设置为 Infinity ,将Cannonother 的值设置为有限值Actors。当你修改life's 的值时,一定要检查 Infinity 并让它保持不变。

public class Hero implements Actor{

    //initialize these fields differently in each Actor implementation
    private Life life;
    private Model model;

    public void init() {
    // different initialization values here
    }
}

public class Cannon implements Actor{

    //initialize these fields differently in each Actor implementation
    private Life life;
    private Model model;

    public void init() {
    // different initialization values here
    }
}
于 2013-09-14T17:31:15.187 回答
1

最简洁的答案是不'。正如您所提到的,Java 不支持多重继承——有些事情是您无法做到的。然而,人们几乎总是可以通过巧妙的应用程序设计来解决这个限制。例如,为什么'Life'不能扩展'Model'?或者您可以只在接口中定义访问器(例如 getHitPoints())?如果您真的觉得需要近似多重继承,请查看AspectJ等面向方面的编程扩展。

于 2013-09-14T17:17:17.653 回答