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

Tyl*_*eat 14 c# inheritance enums

可能重复:
枚举"继承"

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

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 };
}
Run Code Online (Sandbox Code Playgroud)

Mer*_*ham 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

A
D
按任意键继续...


hel*_*922 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
        }
    }
Run Code Online (Sandbox Code Playgroud)