“覆盖”枚举的最佳方法是什么?

时间:2011-01-16 06:54:06

标签: c# inheritance enums

  

可能重复:
  Enum “Inheritance”

我有许多扩展抽象类的类。抽象父类使用一组值定义枚举。一些子类继承父类的枚举值,但某些子类需要枚举值不同。有没有办法以某种方式覆盖这些特定子类的枚举,如果没有,什么是实现我所描述的好方法?

class ParentClass
{
    private MyEnum m_EnumVal;
    public virtual MyEnum EnumVal
    {
        get { return m_EnumVal; }
        set { m_EnumVal = value; }
    }

    public enum MyEnum { a, b, c };
}

class ChildClass : ParentClass
{
    private MyEnum m_EnumVal;
    public virtual MyEnum EnumVal
    {
        get { return m_EnumVal; }
        set { m_EnumVal = value; }
    }

    public enum MyEnum { d, e, f };
}

3 个答案:

答案 0 :(得分:18)

如果您不拥有或无法修改原始基类或枚举,则其他答案都是正确的。如果可以,那么您可以使用类型安全枚举模式。它允许您定义自己的枚举类型,而不是从枚举中派生出来的,它们可以做任何你想做的事情(包括支持继承)。

public class MyEnum
{
  public static readonly MyEnum A = new MyEnum("A");
  public static readonly MyEnum B = new MyEnum("B");
  public static readonly MyEnum C = new MyEnum("C");

  public override string ToString()
  {
    return Value;
  }

  protected MyEnum(string value)
  {
    this.Value = value;
  }

  public string Value { get; private set; }
}

public sealed class MyDerivedEnum : MyEnum
{
  public static readonly MyDerivedEnum D = new MyDerivedEnum("D");

  private MyDerivedEnum(string value)
    : base(value)
  {
  }
}

class Program
{
    static void Main(string[] args)
    {
        MyEnum blah = MyEnum.A;
        System.Console.WriteLine(blah);
        blah = MyDerivedEnum.D;
        System.Console.WriteLine(blah);
    }
}
  

一个
  d
  按任意键继续 。 。

答案 1 :(得分:5)

类允许您仅覆盖虚拟方法,而不是覆盖字段/内部类/枚举。您可以使用new关键字隐藏内部枚举,但任何需要基类枚举的方法都与子类的枚举不兼容。

    class Base
    {
        public enum myEnum
        {
            hello, to, you
        }

        public void doIt(myEnum e)
        {
            Console.Out.WriteLine(e);
        }

        static void Main(string[] args)
        {
            Base a = new Child();
            a.doIt(Child.myEnum.hello); // this is a syntax error because doIt requires a Base.myEnum, not a Child.myEnum.
        }
    }

    class Child : Base
    {
        public new enum myEnum
        {
                hello, my, dear
        }
    }

答案 2 :(得分:1)

您可以使用“new”关键字覆盖您在基类中定义的字段。

class Base
{
   public MyEnum A = MyEnum.Default;
}

class Derived : Base
{
   public new MyEnum A = MyEnum.Changed;
}