0

我在一个类中有两种方法,一种带有额外参数

第一:

public override void CalcV(IV iv)
{
     initializations
     otherOperations

     for (int i=0; i < NUM; ++i)
     {
         SomeOtherOperations
         double v = GetV(a,b,c);
         SomeOtherOperationsUsing_v
     }

     restOfOperations
}

第二个:

public override void CalcV(IV iv, int index)
{
     initializations
     otherOperations

     for (int i=0; i < NUM; ++i)
     {
         SomeOtherOperations
         double v = GetV(a,b,c, index);
         SomeOtherOperationsUsing_v
     }

     restOfOperations
}

如您所见,唯一的区别是第一个调用带有 3 个参数的 GetV(),第二个调用带有 4 个参数的 GetV() 重载。

我怎样才能最好地避免代码重复?

谢谢!

4

5 回答 5

2

假设您不知道合理的默认值,一个非常简单的方法是:

public override void CalcV(IV iv)
{
    CalcV(iv, null);
}

public override void CalcV(IV iv, int? index)
{
     ...
     double v = index.HasValue ? GetV(a,b,c,index.Value) : GetV(a,b,c);
     ...
}
于 2012-05-23T10:18:52.177 回答
1

猜测 GetV 做了什么(你需要改变它以适应:

public override void CalcV(IV iv)
{
     CalcV(iv, 0);
}


public override void CalcV(IV iv, int index)
{
     initializations
     otherOperations

     for (int i=0; i < NUM; ++i)
     {
         SomeOtherOperations
         double v = GetV(a,b,c, index);
         SomeOtherOperationsUsing_v
     }

     restOfOperations
}
于 2012-05-23T10:16:49.753 回答
1

如果您使用的是 .Net 4.0,则可以将其设为可选参数:

public override void CalcV(IV iv, int index = -1)
{
    ....
    double v = index > -1 ? GetV(a,b,c, index) : GetV(a,b,c);

    ....
}
于 2012-05-23T10:18:38.123 回答
1
public override void CalcV(IV iv, int? index = null)
{
     initializations
     otherOperations

     for (int i=0; i < NUM; ++i)
     {
         SomeOtherOperations
         double v = index != null ? GetV(a,b,c, index) : GetV(a,b,c);
         SomeOtherOperationsUsing_v
     }

     restOfOperations
}

然后您可以删除第一个覆盖,这将处理这两种情况。

于 2012-05-23T10:18:50.197 回答
0

我假设index是基于 0 的正数:

public override void CalcV(IV iv, int index)
{
  initializations
  otherOperations

  for (int i=0; i < NUM; ++i)
  {
    SomeOtherOperations
    double v = index == -1 ? GetV(a, b, c) : GetV(a,b,c, index);
    SomeOtherOperationsUsing_v
  }

  restOfOperations
}

然后,如果要使用四个参数调用,则使用索引为 -1 的函数调用要使用GetV三个参数或“正确”索引GetV的函数。

public override void CalcV(IV iv)
{
  return CalcV(iv, -1);
}
于 2012-05-23T10:18:30.953 回答