【问题标题】:In Java, is there some kind of Interface-like that enforces its implementing classes to have specific fields在 Java 中,是否有某种类接口强制其实现类具有特定字段
【发布时间】:2013-09-14 17:02:53
【问题描述】:

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

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

无论它们是哪一种,我希望每个演员都从基类Model 继承,该基类将一些字段赋予其子类,例如positionwidthheight,以便@987654328 的每个子类@ 可以与 ControllerRenderer 关联,就像在 MVC 模式中一样。

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

    public float width;
    public float height;
}

顺便说一句,我打算 HeroBoss 是可以死亡的实体,所以我希望它们是 Life 的实例,例如,public float hitPoint; 作为一个字段,相比之下,Cannon 不是Life,因为它将是一个不朽的实体。因此我尝试了:

public interface Life {
    public float hitPoint;
}

并期望一个实例

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

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

有没有可能用Java实现上述设计。

【问题讨论】:

  • 我相信你需要的是抽象类而不是接口。

标签: java interface multiple-inheritance


【解决方案1】:

接口中只能声明常量。

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

更好的解决方案是这样

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
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      LifeModel 声明为字段成员并根据每个所需的Actor 实现更改它们的初始值和状态是否有意义? 例如,对于 Cannon 对象,将 life 的值设置为 Infinity,对于其他 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
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多