【发布时间】:2012-07-09 18:18:52
【问题描述】:
我有多个枚举,它们都具有相同的构造函数和属性,如下所示:
enum Enum1 {
A(1,2),
B(3,4);
public int a, b;
private Enum1(int a, int b) {
this.a = a;
this.b = b;
}
}
enum Enum2 {
C(6,7),
D(8,9);
public int a, b;
private Enum1(int a, int b) {
this.a = a;
this.b = b;
}
}
等等…… 不幸的是,Enum1 和 Enum2 已经扩展了 Enum,因此不可能编写它们可以扩展的超类。 还有其他方法可以存档吗?
更新:这里有一个“真实世界”的例子。想想一个经典的 rpg,你有物品、盔甲、武器等,它们会给你带来奖励。
enum Weapon {
SWORD(3,0,2),
AXE_OF_HEALTH(3,4,1);
// bonus for those weapons
public int strength, health, defense;
private Weapon(int strength, int health, int defense) {
this.strength = strength;
this.health = health;
this.defense = defense;
}
}
enum Armour {
SHIELD(3,1,6),
BOOTS(0,4,1);
// bonus
public int strength, health, defense;
private Weapon(int strength, int health, int defense) {
this.strength = strength;
this.health = health;
this.defense = defense;
}
}
【问题讨论】:
-
为什么你有单独的
Enum类用于具有几乎相同数据的枚举?为什么C或D不能进入Enum1?我认为向我们提供具体场景可能有助于更接近真正的解决方案。 -
很抱歉,这个设计看起来不太对劲。当然是 YMMV,但这些属性在“个人”盾牌、靴子等上会更好。我建议使用具有类型字段的“项目”,而这又是一个枚举 没有 属性。当然还有其他方法可以做到这一点,但请让信息作为类属性的一部分(由配置驱动)而不是让它们“硬编码”。
-
@SanjayT.Sharma 所以你会这样做:see pastebin。那我怎么能得到例如一个随机的后缀?
-
@user28061:不,看起来还是不对。为什么你如此专注于使用“枚举”?为什么这些实体不能单独成为一个不同的类(例如
GameEntity而不是enum?将自己与通常非常动态的东西(游戏实体)的枚举捆绑在一起,具有行为并且是其中的一部分逻辑层次结构(即可能需要继承功能)是 IMO 的一个大错误。从常规类开始并编写解决直接问题(工作游戏)的东西,而不是与枚举限制作斗争。:)