如何避免在不同的函数中使用相同的switch语句?

问题描述 投票:0回答:1

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

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# optimization delegates switch-statement
1个回答
0
投票

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

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

是和否

No,使用Enum和控件结构不可能更好地解决它。投入到开关/案例中的枚举已经是您可以在代码中完成的最少工作。

,可以做得更好。您这里应该没有的不是1在枚举值上表现不同的实现。您应该一直为此接口使用3种不同的实现]

一堆函数的行为不同,它们都引用相同的东西?这就是在继承期间进行重写的目的!

可能只有一种奇怪的情况,也就是说,如果您需要能够change在状态之间进行枚举/转换。由于使用一个实例初始化另一个实例的能力,这也不是什么大问题。

看看List<T> class constructors。其中之一将IEnumerable<T>作为输入。所有通用集合都实现该接口,甚至数组也隐式地覆盖为一个(实际上,每次使用foreach循环时都会发生这种情况)。因此它们都可以互相用作初始化程序。它还有一个ToArray() function

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

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

© www.soinside.com 2019 - 2024. All rights reserved.