这是我的代码:
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?
答案 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()));
}
}