在这种情况下如何使用委托/泛型

本文关键字:泛型 何使用 这种情况下 | 更新日期: 2023-09-27 18:17:21

我有两个枚举:enum1, enum2。

有两个函数:

bool func1(int param1 , enum1 type)
bool func1(int param1 , enum2 type)

两个函数具有完全相似的结构。所有条件的唯一区别是:func1有enum1。Str1用于所有比较,func2具有enum2。Str2用于所有比较

因为这两个函数很相似,我想把它们结合起来…最好的方法是什么?

func1(int param1, enum1 type)
{
      if (type.Equals(enum1.abc))
      {
        // do something
      }
      else if(type.Equals(enum1.def))
      {
    // do something
      }
}

func2(int param1, enum2 type)
{
      if (type.Equals(enum2.abcd))
      {
        // do something
      }
      else if(type.Equals(enum2.defg))
      {
    // do something
      }
}

在这种情况下如何使用委托/泛型

有两种简单的方法来处理这个问题,这取决于enum1enum2的兼容性。

如果它们是100%兼容的,那么你可以想象这样:

bool Func1(int param1, enum1 type)
{
     switch (type) {
         case enum1.abc:
         // ...
         break
         // ...
     }
}
bool Func2(int param1, enum2 type) { Func1(param1, ToEnum1(type)) }
private static enum1 ToEnum1(enum2 type)
{
    switch(type)
    {
        case enum2.abc: return enum1.abc;
        // ...
        default: throw new NotImplementedException("missed a case!");
    }
}

现在,为什么我使用一个带有转换开关的函数而不是强制转换?答案是当你改变了一个枚举的布局而没有改变另一个枚举的布局时抓住这个错误——这很糟糕。

如果类型不兼容,可以考虑定义第三个枚举,它由所有重叠的值加上所有不重叠的值组成——实际上是创建两个枚举类型的适当联合。根据第三个枚举转换为write Func1。您可以(而且可能应该)将第三种类型设置为正在执行该工作的类的私有类型。

在本质上,它们本质上是相同的解决方案,只是在第一种情况下,其中一个枚举类型已经与第三个类型相同。

如果底层枚举值匹配:

bool Func1(int param1, enum1 type)
{
    return Func2(param1, (enum2)type);
}

如果不相同:

bool Func1(int param1, enum1 type)
{
    switch (type)
    {
        case enum1.abc: return Func2(param1, enum2.abc);
        case enum1.def: return Func2(param1, enum2.def);
    }
}

听起来泛型不一定是最好的解决方案。如果您主要对减少代码重用感兴趣,您可以尝试这样做:

func1(int param1, enum1 type)
{
    if (type.Equals(enum1.abc))
    {
        doSomethingAbc(param1);
    }
    else if(type.Equals(enum1.def))
    {
        doSomethingDef(param1);
    }
}

func2(int param1, enum2 type)
{
    if (type.Equals(enum2.abc))
    {
        doSomethingAbc(param1);
    }
    else if(type.Equals(enum2.def))
    {
        doSomethingDef(param1);
    }
}
private void doSomethingAbc(int param1) { ... }
private void doSomethingDef(int param1) { ... }