2

我有多个枚举,它们都具有相同的构造函数和属性,如下所示:

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;
    }
}
4

4 回答 4

3

您必须将它们结合起来(如果那不是一个好主意,则不必)

enum Enum1 {
    A(1,2),
    B(3,4),
    C(6,7),
    D(8,9);
于 2012-07-10T09:40:28.363 回答
1
No, you can't extend enums in Java.

正如彼得所说,您可以将它们结合起来。

我是可以帮助你。

于 2012-07-10T09:42:14.593 回答
1

枚举扩展枚举。他们也不能扩展其他东西。但是,它们可以实现接口。

您可以让它们都实现一个通用接口,并将您的 getA()、getB() 方法放在接口上。

于 2012-07-10T09:45:52.647 回答
0

您可以尝试使用它,然后将标志添加到您的枚举中:



    public class ExtendetFlags : Attribute
    {
        #region Properties

        /// 
        /// Holds the flagvalue for a value in an enum.
        /// 
        public string FlagValue { get; protected set; }

        #endregion

        #region Constructor

        /// 
        /// Constructor used to init a FlagValue Attribute
        /// 
        /// 
        public ExtendetFlags(string value)
        {
            this.FlagValue = value;
        }

        #endregion
    }

    public static class ExtendetFlagsGet
    {
        /// 
        /// Will get the string value for a given enums value, this will
        /// only work if you assign the FlagValue attribute to
        /// the items in your enum.
        /// 
        /// 
        /// 
        public static string GetFlagValue(this Enum value)
        {
            // Get the type
            Type type = value.GetType();

            // Get fieldinfo for this type
            FieldInfo fieldInfo = type.GetField(value.ToString());

            // Get the stringvalue attributes
            ExtendetFlags[] attribs = fieldInfo.GetCustomAttributes(
                typeof(ExtendetFlags), false) as ExtendetFlags[];

            // Return the first if there was a match.
            return attribs.Length > 0 ? attribs[0].FlagValue : null;
        }
    }


使用很简单:


`            [ExtendetFlags("test1")]
            Application = 1,
            [ExtendetFlags("test2")]
            Service = 2
`
于 2016-03-23T09:08:12.487 回答