在Java中,是否存在某种类似于Interface的实现其具有特定字段的实现类

时间:2013-09-14 17:02:53

标签: java interface multiple-inheritance

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

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

无论它们是哪种类型,我希望每个actor都从基类Model继承,它将一些字段赋予其子类,例如positionwidth和{{1}这样height的每个子类都可以与MVC模式中的ModelController相关联。

Renderer

顺便说一句,我打算public class Model { //position public float x; public float y; public float width; public float height; } Hero是可以死的实体,所以我希望它们是Boss的实例,例如,Life被强制执行相反,作为一个字段,public float hitPoint;不是Cannon,因为它将是一个不朽的实体。因此我尝试了:

Life

并期望一个

的实例
public interface Life {
    public float hitPoint;
}

本质上会有public class Hero extends Model implements Life {...} 。但后来我了解到接口中的实例字段在Java中是不允许的,并且它也不支持多重继承。

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

3 个答案:

答案 0 :(得分:2)

只能在接口中声明常量。

您在界面中定义的任何内容始终为public static final(除了public abstract之外的方法除外)如果hitpoints值永远不会改变,那么此设计适合您。< / p>

更好的解决方案是

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
}

答案 1 :(得分:1)

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

答案 2 :(得分:1)

LifeModel声明为字段成员并根据每个所需的Actor实现更改其初始值和状态是否有意义? 例如,为life个对象设置Cannon的值为无穷大,为其他Actors设置为有限值。当你修改life的值时,一定要检查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
    }
}