我了解到Java不允许接口中的实例字段,但我真的想要这个功能。
我正在学习创建我的第一个游戏。我的游戏有不同类型的演员,例如Hero
(由玩家控制),Boss
,Canon
等......
无论它们是哪种类型,我希望每个actor都从基类Model
继承,它将一些字段赋予其子类,例如position
,width
和{{1}这样height
的每个子类都可以与MVC模式中的Model
和Controller
相关联。
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中实现上述设计。
答案 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)
将Life
和Model
声明为字段成员并根据每个所需的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
}
}