簡體   English   中英

如何在C#中覆蓋枚舉?

[英]How can you override an enum in C#?

這是我的代碼:

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始終顯示:

柯克,斯波克,蘇祿,斯科特

即使它是在NewGeneration類中調用的。 我錯過/誤解了什么嗎? ShowEnum有沒有辦法使用NewGeneration.Characters而不是StarTrek.Characters?

你的第二個枚舉是遮蔽第一個枚舉,就像在NewGeneration聲明一個新字段一樣。 嵌套類型不是多態的 - ShowEnum的代碼總是引用StarTrek.Characters ; 代碼是在編譯時針對該類型構建的。

你要做的事情並不是很清楚,但是你絕對不能以你正在嘗試的方式去做。 如果您需要多態行為, 必須使用方法,屬性或事件,然后必須將其聲明為虛擬,以便在派生類中重寫。

(值得注意的是,重載和覆蓋是不同的,順便說一句 - 你的問題是指超載,但我認為你的意思是重寫。)

你不能重載enum - 它們不是類或結構。

但是,對於internal new您只是隱藏了原始屬性,因為您在基類上定義了ShowEnum ,所以調用該屬性的基類實現。

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()));

    }
}
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 };
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM