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

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

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

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

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

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

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

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

你不想为每一个逻辑提供一个具体的类 – 但这基本上就是你用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 accept; private Logic(Action 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 } } 

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

如果您不想使用接口和类层次结构,则可以使用委托,例如:

 public class Player{} public static class Logic { public static readonly Action PAY_DAY = p => Console.WriteLine( "Pay day : " + p.ToString()); public static readonly Action COLLECT_CASH = p=> Console.WriteLine(p.ToString ()); public static void AcceptPlayer( this Action PlayerAction, Player ActingPlayer ) { PlayerAction(ActingPlayer); } } class MainClass { public static void Main (string[] args) { var player = new Player(); Logic.PAY_DAY.AcceptPlayer( player ); } } 

在c#中,您使用类而不是枚举来完成此操作。 使用要覆盖的虚方法创建基类。

Java枚举的每个成员都将是一个具有所需实现的子类。

最后,在每个枚举成员的基类中创建一个只读静态字段,并使用该枚举值的子类实例对其进行初始化。