我正在制作一个有不同类型建筑的游戏。我正在为每种类型制作一个界面。有些建筑有一种以上的类型。
我有这段代码:
public interface DefenseBuilding {
int range;
int damage;
public void shoot ();
}
它给出了2个变量声明(范围和损坏)的错误。错误是“最终变量可能无法初始化”
如果我在界面中分配变量,它可以工作,但我不想这样做。
我不能只扩展一个类,因为 - 如前所述 - 一些建筑物需要超过1种类型。类只能扩展另外一个类,所以我需要使用接口。
我要问的是,有没有办法让接口中的变量不必初始化接口内的变量?
答案 0 :(得分:2)
接口的重点是指定为接口 - 即您的类接口将如何与客户端类一起使用。实例变量显然不是任何接口的一部分。
相反,试试这个:
public interface DefenseBuilding {
public void shoot ();
}
和此:
public abstract class AbstractDefenseBuilding implements DefenceBuilding {
protected int range;
protected int damage;
}
修改强>:
您的类现在应该扩展AbstractDefenseBuilding
,因此它们将继承变量。他们还间接实现DefenceBuilding
,因此他们仍然会被迫实施shoot()
方法(除非它们也是抽象的)
答案 1 :(得分:1)
您可以使用属性方法aproach。
public interface DefenseBuilding {
public void setRange(int range);
public int getRange();
public void setDamage(int damage);
public int getDamage();
public void shoot ();
}
然后在你的班级
public MyClass implements DefenseBuilding{
int range;
int damage;
public int getRange() {
return range;
}
public void setRange(int range) {
this.range = range;
}
public int getDamage() {
return damage;
}
public void setDamage(int damage) {
this.damage = damage;
}
public void shoot (){...}
}
答案 2 :(得分:0)
接口中的所有变量都是static
和final
。因此,除非初始化,否则编译器将继续给出一个未初始化的错误。这是强制执行的,因为接口无法实例化,因此任何变量都应该是静态的,不能更改。
如果您打算定义类变量,请按照NickJ的建议进行。
答案 3 :(得分:0)
接口定义行为但不定义状态(除了常量)。受保护的变量是正确封装数据的潜在危险(对象应隐藏其数据并通过方法提供访问,除非有非常令人信服的理由不这样做)。另一种选择是:
df(df(3))
提供部分实现接口的抽象类也很常见:
public interface DefenseBuilding {
public void shoot();
public int getRange();
public int getDamage();
}