通过继承扩展枚举

2022-08-31 10:42:18

我知道这与枚举的想法背道而驰,但是是否可以在C#/Java中扩展枚举?我的意思是“扩展”,既有向枚举添加新值的意义,也有从现有枚举继承的OO意义上的。

我认为这在Java中是不可能的,因为它最近才得到它们(Java 5?)。不过,C#似乎更宽容那些想要做疯狂事情的人,所以我认为这可能是可能的。大概它可以通过反射被黑客入侵(不是说你每个人都会真正使用这种方法)?

我不一定对实现任何给定的方法感兴趣,当它发生在我身上时,它只是激起了我的好奇心:-)


答案 1

您无法扩展枚举的原因是因为它会导致多态性问题。

假设您有一个包含值 A、B 和 C 的枚举 MyEnum,并使用值 D 将其扩展为 MyExtEnum。

假设一个方法在某个地方需要 myEnum 值,例如作为参数。提供MyExtEnum值应该是合法的,因为它是一个子类型,但是现在当它被证明是D时,你该怎么办?

为了消除这个问题,扩展枚举是非法的


答案 2

当内置枚举还不够时,您可以采用老式的方式进行制作,并制作自己的枚举。例如,如果要添加其他属性(例如,说明字段),可以按如下方式进行:

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

诀窍是确保构造函数是私有的(或者如果您想要继承,则受保护),并且您的实例是静态的。


推荐