首页 > 解决方案 > 如何避免在不同的函数中使用相同的switch语句?

问题描述

我有一个类的接口,接口的函数应该根据我使用函数的类的状态(枚举)而有所不同。

public class Test : Interface
{
    Enum state = Enum.s1;
    int test = 0
    public void fn1(int x)
    {
        switch(state)
        {
            case Enum.s1:
                {
                    test += x;
                    break;
                }
            ...
        }
    }
    public void fn2(int x, ref int y)
    {
        switch (state)
        {
            case Enum.s1:
                {
                    y += x*test;
                    break;
                }
            ...
        }
    }
    public bool fn3()
    {
        switch (state)
        {
            case Enum.s1:
                {
                    return DoStuff(test);
                    break;
                }
            ...
        }

    }
}

是否可以进行一次评估并将其用于所有功能?

我是代表的新手,但是只为 fn1/fn2/fn3 创建一个代表并在每次状态更改时填充它们所需的功能可能是一个很好的解决方案吗?

我问是因为我认为对此有更好的解决方案。

谢谢您的帮助 :)

标签: c#optimizationdelegatesswitch-statement

解决方案


我有一个类的接口,接口的函数应该根据我使用函数的类的状态(枚举)而有所不同。

是否可以进行一次评估并将其用于所有功能?

是和否。

,不可能用 Enum 和控制结构更好地解决它。输入开关/案例的枚举已经是您在代码中可以做的最少的工作。

的,有可能做得更好。您在这里应该拥有的不是 1 在枚举值上表现不同的实现。你应该一直有 3 个不同的实现这个接口

一堆函数的不同行为,都引用同一个东西?这就是在继承期间覆盖的目的!

可能只有一种奇怪的情况,那就是如果您需要能够在状态之间更改Enum/Convert。由于使用一个实例初始化另一个实例的能力,这也不是什么大问题。

看看List<T> 类构造函数。其中一个将 aIEnumerable<T>作为输入。所有通用集合都实现了该接口,甚至数组也被隐式转换为一个(实际上每次使用 foreach 循环时都会发生)。所以他们都可以互相使用作为初始化器。它还有一个ToArray() 功能

我可以发誓一些流类可以将其他流作为构造函数参数。一种将流相互包装的简单方法。但是找不到。在任何情况下,大多数都将Byte[]其作为 C-tor 论点。并且它们都可以表达/隐式转换为Byte[]. 奇怪的是,这种行为甚至没有在抽象基类中定义。这只是大多数继承人所做的事情。

编辑:另外,如果您仍然需要其他代码的 Enum 值:只读属性。与普通字段不同,它们可以添加到接口中。每个实现都可以返回不同的硬编码值。


推荐阅读