通过继承扩展枚举
我知道这与枚举的想法背道而驰,但是是否可以在C#/Java中扩展枚举?我的意思是“扩展”,既有向枚举添加新值的意义,也有从现有枚举继承的OO意义上的。
我认为这在Java中是不可能的,因为它最近才得到它们(Java 5?)。不过,C#似乎更宽容那些想要做疯狂事情的人,所以我认为这可能是可能的。大概它可以通过反射被黑客入侵(不是说你每个人都会真正使用这种方法)?
我不一定对实现任何给定的方法感兴趣,当它发生在我身上时,它只是激起了我的好奇心:-)
我知道这与枚举的想法背道而驰,但是是否可以在C#/Java中扩展枚举?我的意思是“扩展”,既有向枚举添加新值的意义,也有从现有枚举继承的OO意义上的。
我认为这在Java中是不可能的,因为它最近才得到它们(Java 5?)。不过,C#似乎更宽容那些想要做疯狂事情的人,所以我认为这可能是可能的。大概它可以通过反射被黑客入侵(不是说你每个人都会真正使用这种方法)?
我不一定对实现任何给定的方法感兴趣,当它发生在我身上时,它只是激起了我的好奇心:-)
您无法扩展枚举的原因是因为它会导致多态性问题。
假设您有一个包含值 A、B 和 C 的枚举 MyEnum,并使用值 D 将其扩展为 MyExtEnum。
假设一个方法在某个地方需要 myEnum 值,例如作为参数。提供MyExtEnum值应该是合法的,因为它是一个子类型,但是现在当它被证明是D时,你该怎么办?
为了消除这个问题,扩展枚举是非法的
当内置枚举还不够时,您可以采用老式的方式进行制作,并制作自己的枚举。例如,如果要添加其他属性(例如,说明字段),可以按如下方式进行:
public class Action {
public string Name {get; private set;}
public string Description {get; private set;}
private Action(string name, string description) {
Name = name;
Description = description;
}
public static Action DoIt = new Action("Do it", "This does things");
public static Action StopIt = new Action("Stop It", "This stops things");
}
然后,您可以像枚举一样对待它:
public void ProcessAction(Action a) {
Console.WriteLine("Performing action: " + a.Name)
if (a == Action.DoIt) {
// ... and so on
}
}
诀窍是确保构造函数是私有的(或者如果您想要继承,则受保护),并且您的实例是静态的。