如何在C#中覆盖枚举?

时间:2011-10-18 13:26:57

标签: c# enums overloading

这是我的代码:

void Main()
{
    StarTrek baseClass = new StarTrek();
    NewGeneration childClass = new NewGeneration();

    baseClass.ShowEnum();
    childClass.ShowEnum();
}

public class StarTrek
{
    internal enum Characters
    {
        Kirk, Spock, Sulu, Scott
    }

    public void ShowEnum()
    {
        Type reflectedEnum = typeof(Characters);
        IEnumerable<string> members = reflectedEnum.GetFields()
                                            .ToList()
                                            .Where(item => item.IsSpecialName == false)
                                            .Select(item => item.Name);
        string.Join(", ", members).Dump();
    }
}

public class NewGeneration : StarTrek
{
    internal new enum Characters
    {
        Picard, Riker, Worf, Geordi
    }       
}

ShowEnum始终显示:

  

Kirk,Spock,Sulu,Scott

即使在NewGeneration类中调用它。我错过/误解了什么吗?有没有办法让ShowEnum使用NewGeneration.Characters而不是StarTrek.Characters?

4 个答案:

答案 0 :(得分:6)

你的第二个枚举是 shadowing 第一个,就像在NewGeneration中声明一个新字段一样。嵌套类型不是多态的 - ShowEnum中的代码总是引用StarTrek.Characters;代码是在编译时针对该类型构建的。

你要做的事情并不是很清楚,但是你绝对不能以你正在尝试的方式去做。如果您需要多态行为,则 要使用方法,属性或事件,然后必须将其声明为虚拟,以便在派生类中重写。

(值得注意的是,重载和覆盖是不同的,顺便说一句 - 你的问题是指超载,但我认为你的意思是重写。)

答案 1 :(得分:2)

你不能重载enum - 它们不是类或结构。

使用internal new,您只是隐藏原始属性,但由于您在基类上定义了ShowEnum,因此调用该属性的基类实现

答案 2 :(得分:1)

public class StarTrek
{
    internal virtual IList<string> Characters
    {
        get
        {
            return new List<string> { Kirk, Spock, Sulu, Scott };
        }
    }

    public void ShowEnum()
    {
        string.Join(", ", Characters).Dump();
    }
}

public class NewGeneration : StarTrek
{
    internal override IList<string> Characters
    {
        get
        {
            return new List<string> { Picard, Riker, Worf, Geordi };
        }
    }
}

答案 3 :(得分:1)

class Program
{
    public static void Main()
    {
        StarTrek baseClass = new StarTrek();
        NewGeneration childClass = new NewGeneration();

        baseClass.ShowEnum();
        childClass.ShowEnum();
        Console.ReadLine();
    }
}


public class StarTrek
{
    internal enum Characters
    {
        Kirk, Spock, Sulu, Scott
    }

    public virtual void ShowEnum()
    {
        Type reflectedEnum = typeof(Characters);
        IEnumerable<string> members = reflectedEnum.GetFields()
                                            .ToList()
                                            .Where(item => item.IsSpecialName == false)
                                            .Select(item => item.Name);
        Console.WriteLine(string.Join(", ", members.ToArray()));
    }
}

public class NewGeneration : StarTrek
{
    internal new enum Characters
    {
        Picard, Riker, Worf, Geordi
    }

    public override void ShowEnum()
    {
        Type reflectedEnum = typeof(Characters);
        IEnumerable<string> members = reflectedEnum.GetFields()
                                            .ToList()
                                            .Where(item => item.IsSpecialName == false)
                                            .Select(item => item.Name);
        Console.WriteLine(string.Join(", ", members.ToArray()));

    }
}