2012-05-23 8 views
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 
} 

, как вы можете увидеть только разницу что первый вызывает GetV() с 3 параметрами, а второй вызывает перегрузку GetV() с 4 параметрами.

Насколько я могу избежать дублирования кода здесь?

Спасибо!

+1

Конечно, есть индекс по умолчанию, что вы могли бы использовать – skarmats

ответ

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); 

    .... 
} 
+0

Это очень близко, но без контекста вы не можете быть уверены, что GetV не принимает отрицательные значения для 'index'. – Digitalex

+0

Спасибо, Дейв! очевидно, мне нужен кофе! – jambodev

+0

Можете ли вы когда-нибудь иметь отрицательный индекс? Я никогда не рассматривал это философски: D .... –

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 
} 
+0

Это, вероятно, следует сделать это. – t3hn00b

+0

Да, это или параметр по умолчанию - независимо от того, что плавает ваша лодка :) –

+1

Ну ... Это, вероятно, не сделает этого, поскольку, как вы сказали, вы предполагаете, что 'GetV' с тремя параметрами делает то же самое, что и« GetV »с четырьмя , –

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); 
} 
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 
} 

Затем вы можете удалить первую переопределение, и это будет иметь дело с обоих сценариев.

+0

Это действительно приятно - лучший ответ, так как он короткий и правильный, без каких-либо предположений. – Digitalex

+0

Спасибо за это, это было вдохновлено вашим использованием null! – ThePower

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); 
    ... 
} 
+0

Некоторые из других ответов предполагают либо 1) что GetV (a, b, c, 0) == GetV (a, b, c) или/и 2), что 'index' строго неотрицателен. Это не всегда верно и сейчас, и в будущем. Мой подход не предполагает ни того, ни другого. – Digitalex

Смежные вопросы