是否有可能在c#中模仿这个java enum代码

Ala*_*ter 4 c# java enums

是否有可能复制在枚举中提供抽象方法的功能,内部枚举常量必须覆盖并提供功能?

public enum Logic {
    PAY_DAY {
        @Override
        public void acceptPlayer(Player player) {
            // Perform logic
        }
    },
    COLLECT_CASH {
        @Override
        public void acceptPlayer(Player player) {
            // Perform logic
        }
    }
    ,
    ETC_ETC {
        @Override
        public void acceptPlayer(Player player) {
            // Perform logic
        }
    };

    public abstract void acceptPlayer(Player player);
}
Run Code Online (Sandbox Code Playgroud)

如果它不能:: 你能提供一种方法,我可以用类似的方式实现许多特定的逻辑吗?

编辑::我知道C#中的枚举并不像Java那样真正的"对象",但我希望执行类似的逻辑.

编辑::为了澄清,我不想为每个特定的逻辑位提供具体的类.IE,创建一个接口acceptPlayer并创建许多新类是不合适的

Jon*_*eet 5

这是一个选项 - 不使用枚举,但类似的东西 - 是...

public abstract class Logic
{
    public static readonly Logic PayDay = new PayDayImpl();
    public static readonly Logic CollectCash = new CollectCashImpl();
    public static readonly Logic EtcEtc = new EtcEtcImpl();

    // Prevent other classes from subclassing
    private Logic() {}

    public abstract void AcceptPlayer(Player player);

    private class PayDayImpl : Logic
    {
        public override void AcceptPlayer(Player player)
        {
            // Perform logic
        }
    }

    private class CollectCashImpl : Logic
    {
        public override void AcceptPlayer(Player player)
        {
            // Perform logic
        }
    }

    private class EtcEtcImpl : Logic
    {
        public override void AcceptPlayer(Player player)
        {
            // Perform logic
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你不想为每一个逻辑提供一个具体的类 - 但这基本上就是你用Java做的事情,只是这个类会稍微隐藏你.

以下是使用委托处理不同行为的替代方法:

public sealed class Logic
{
    public static readonly Logic PayDay = new Logic(PayDayAccept);
    public static readonly Logic CollectCash = new Logic(CollectCashAccept);
    public static readonly Logic EtcEtc = new Logic(player => {
        // An alternative using lambdas...
    });

    private readonly Action<Player> accept;

    private Logic(Action<Player> accept)
    {
        this.accept = accept;
    }

    public void AcceptPlayer(Player player)
    {
        accept(player);
    }

    private static void PayDayAccept(Player player)
    {
        // Logic here
    }

    private static void CollectCashAccept(Player player)
    {
        // Logic here
    }
}
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,您仍然可以获得一组固定的值 - 但您将无法打开它们.你可能有一个单独的"真实"枚举,但这会有点混乱.