当前位置: 首页 > 面试题库 >

是否有可能在C#中模仿此Java枚举代码

令狐嘉运
2023-03-14
问题内容

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

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

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



 类似资料:
  • 问题内容: 我正在尝试将我的某些Obj-C类转换为Swift。还有其他一些Obj- C类仍在该转换后的类中使用枚举。我在“预发布文档”中进行了搜索,但找不到它,或者我错过了它。有没有办法在Obj- C类中使用Swift枚举?或指向此问题的文档的链接? 这就是我在旧的Obj-C代码和新的Swift代码中声明枚举的方式。 我以前的Obj-C代码: 我的新Swift代码: 更新: 从答案。在Swift低

  • 问题内容: 无论如何,通过将其与给定的字符串进行比较来检查是否存在枚举?我似乎找不到任何这样的功能。我可以尝试使用该方法并捕获异常,但是据我了解,捕获运行时异常不是一种好习惯。有人有什么想法吗? 问题答案: 我不认为没有捕获异常的内置方法。您可以改用如下方式: 编辑: 正如乔恩·斯凯特(Jon Skeet)所述,每次调用时,都会通过克隆私有支持数组来工作。如果性能至关重要,则可能只需要调用一次,缓

  • 问题内容: 在Java中有可能发生这种情况吗?可以为Java中的枚举元素分配自定义数值吗? 问题答案:

  • 问题内容: 我已经看过Scala有关模拟Javaenum和case类与Enumeration的问题,但是似乎付出了太多的努力却却获得了太多的好处。 基本上,我希望有一个方法可以返回的所有单例对象,而无需重复几次。 这是我的代码的样子: 该方法应该返回类似如下的内容: 一切都应该发生在特征中,所以我只需要扩展它即可获得功能。 有什么建议可以做到这一点吗?这个想法是访问类并找到它们正在扩展的类的所有单

  • 问题内容: 我正在使用Java,我创建了一个枚举,如下所示: 上面的示例在以元素名称(即北美)使用空格时给出了错误。有什么建议可以解决上述问题吗? 问题答案: 您不能在标识符中间放置空格。 这样做结束了标识符,并且解析器假定接下来要执行的操作是该语句上下文中的有效令牌。很少(如果有)合法的地方。 常规的Java值名称为: 一个可以具有相关属性,如人类可读的名称,例如, 我对用于提供表示层表示形式有

  • 问题内容: 在Python中,该函数允许您迭代一系列(索引,值)对。例如: 用Java有什么办法吗? 问题答案: 对于实现接口的集合,您可以调用方法以获取。迭代器(还有其他方法)有两种方法- ,以获得索引;和,以获取值(与其他迭代器一样)。 因此,上述Python的Java等效项可能是: 与Python一样,它输出: