可能重复:
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 };
}
答案 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;
}