0

クラスには 2 つのフレーバーのメソッドがあり、1 つは追加のパラメーターを持ちます

最初の1つ:

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
}

そして2番目のもの:

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() を呼び出し、2 つ目は 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
}

次に、3 つのパラメーターで使用する -1 のインデックスで関数を呼び出すGetVか、4 つのパラメーターで呼び出したい場合は "正しい" インデックスで関数を呼び出しGetVます。

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