[英]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.