代码之家  ›  专栏  ›  技术社区  ›  Sergio Tapia

使用枚举是列出不同“车型”的最佳方法

  •  1
  • Sergio Tapia  · 技术社区  · 15 年前

    我的汽车类中有一个名为vehicletype的属性。

    使用枚举,我可以列出存在和不存在的不同类型的汽车 允许 任何其他需要硬写的类型。

    问题是,如果我必须从其他地方获取属性,我将得到一个数字值,而不是我保存的字符串文字。

    我在这里应该用什么?

    class Hero
    {
        public string faction;
        public string name;
        public string herotype;
    
        enum HeroType
        {
            Agility,
            Strength,
            Intelligence,
        }
    }
    
    4 回复  |  直到 15 年前
        1
  •  3
  •   marc_s    15 年前

    您可以创建一个抽象基类

    public abstract class BaseHero
    {
        public string faction;
        public string name;
        ...... more properties
    } 
    

    然后从中得到你的英雄:

    public class AgilityHero : BaseHero
    {
    } 
    
    public class StrengthHero : BaseHero
    {
    } 
    
    public class IntelligenceHero : BaseHero
    {
    } 
    

    普通的东西将在基类中处理和编码,这些东西是特定于实际英雄类中的英雄类型的。

    使用这种OO方法,您可以避免编写、编写代码、维护大量 if....then.....else switch 你的陈述 Hero 类-区别是由不同类型的英雄来处理的。

        2
  •  3
  •   mpen    15 年前

    什么?为什么要有一个字符串文本和一个枚举?你的班级应该是这样的:

    class Hero
    {
        public string faction;
        public string name;
        public HeroType herotype; // <-- not a string
    
        enum HeroType
        {
            Agility,
            Strength,
            Intelligence,
        }
    }
    

    “string”版本只是一个枚举,因此更容易记住,但实际上不应在任何地方保存为字符串(除非需要向用户显示)。

        3
  •  1
  •   Jason Williams    15 年前

    枚举是否合适完全取决于您的设计。如果您有固定数量的可能值,那么枚举可能是一种好方法。

    在C中,可以使用 Enum.ToString() Enum.Parse() 因此,在重新加载数据时,序列化枚举值和不允许“非法”值非常容易。不需要将其序列化为整数值。

    (需要注意的一点是,如果使用模糊,则必须确保不要模糊枚举类型)

    如果你 要将枚举存储为整数值,则只要不更改枚举项的值,就不会有问题-在枚举列表的末尾添加新项,但不要在其中插入新项。

        4
  •  0
  •   jeroenh    15 年前

    我有时会对更丰富的“类枚举”类型进行建模,方法如下:

    public enum HeroTypeValue
    {
        Agility,
        Strength,
        Intelligence   
    }
    
    
    public class HeroType
    {
        public HeroTypeValue Value { get; set; }
        public string Description { get; set; }
    
        // ... other properties and possibly behaviour, as needed
    
        public static HeroType Agility = new HeroType 
                               { 
                                  ID = HeroTypeValue.Agility, 
                                  Description = "Agility" 
                               },
    
        public static HeroType Strength = new HeroType
                               { 
                                  ID = HeroTypeValue.Strength, 
                                  Description = "Agility" 
                               };
    
        public static HeroType Intelligence = new HeroType 
                               { 
                                  ID = HeroTypeValue. Intelligence, 
                                  Description = "Intelligence" 
                               };
    
        public static IEnumerable<HeroType> All = new [] 
        {
            Agility,
            Strength,
            Intelligence
        }
    }
    

    这允许使用易于定制的描述进行数据绑定,必要时还可以与数据库中的表同步。

    当然,您可以将它与Marc_s的答案结合起来,使Herotype成为附加OO值的一个(抽象的或非抽象的)基类。