【问题标题】:same switch case is used but the definition is different [duplicate]使用相同的开关盒,但定义不同[重复]
【发布时间】:2013-09-25 07:44:46
【问题描述】:

我必须在不同的功能中重复使用相同的开关盒。在不同的功能中,switch case的定义会有所不同。例如:

    int groupID = somenumber;
    private void FunctionA()
    {
        switch (groupID)
        {
            case 0:
                // Do Action A
                break;
            case 1:
                // Do Action B
                break;
            case 2:
                // Do Action C
                break;
        }
    }

    private void FunctionB()
    {
        switch (groupID)
        {
            case 0:
                // Do Action Z
                break;
            case 1:
                // Do Action X
                break;
            case 2:
                // Do Action Y
                break;
        }
    }

是否有任何方法可以一次使用相同的 switch case 但定义可以不同?

【问题讨论】:

  • 处理这些情况的最佳方法是使用多态性和继承。您考虑过这种方法吗?
  • 多态和继承?怎么样?
  • @DEN:重构的名称非常简单:Replace conditional with polymorphism

标签: c# switch-statement


【解决方案1】:

我真诚地相信有更好的方法来做你想做的事情,但你需要向我们提供更多细节。

在当前情况下,一种可能的解决方案是:

private void SwitchStuff(Action action0, Action action1, Action action2)
{
    switch (groupID)
    {
        case 0:
            action0();
            break;
        case 1:
            action1();
            break;
        case 2:
            action2();
            break;
    }
}

并像这样使用它:

SwitchStuff(DoActionA, DoActionB, DoActionC);
SwitchStuff(DoActionX, DoActionY, DoActionZ);

这些操作是 lambdas/普通方法。

【讨论】:

  • 你也可以传入一个actions数组。
【解决方案2】:

一种可能性是使用一种使用 Action 委托的方法,如下所示:

private void MyFunction(int groupID, Action a, Action b, Action c)
{
    switch (groupID)
    {
        case 0:
            a();
            break;
        case 1:
            b();
            break;
        case 2:
            c();
            break;
    }
}

那么你可以这样称呼它:

MyFunction( groupId, A, B, C );

MyFunction( groupId, Z, X, Y );

编辑

或者更好的方法是 Matthew Watson 建议的变体:

将方法改为

private void MyFunction(int groupID, params Action[] actions)
{
  actions[groupId]();
}

并摆脱整个开关盒。您调用它的方式与上面完全相同。

【讨论】:

    【解决方案3】:

    您可以用多态性替换 switch 语句。创建代表您的组的接口或基类:

    public interface Group
    {
        void FunctionA(); // if Group is a class, then make these methods
        void FunctionB(); // virtual or abstract
    }
    

    然后为每个组创建类(抱歉,我不知道 0、1、2 在这里是什么意思,所以考虑更好的描述性名称):

    public class Group0 : Group
    {
       public void FunctionA()
       {
          // Do Action A
       }
    
       public void FunctionB()
       {
          // Do Action Z
       }
    }
    

    然后你创建适当的组实例:

    private IGroup CreateGroup(int groupID)
    {
        switch (groupID)
        {
            case 0: return new Group0();
            case 1: return new Group1();
            case 2: return new Group2();
            default: 
               throw new ArgumentException();
        }
    }
    

    并在您的应用程序中使用此组实例(应用程序不知道它正在使用哪个组实现):

    IGroup group = CreateGroup(somenumber);
    group.FunctionA(); // if group is Group1 then do action B
    group.FunctionB(); // if group is Group1 then do action X
    

    【讨论】:

    • 谢谢!稍后会尝试一下。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 2018-03-25
    • 2012-01-18
    相关资源
    最近更新 更多