Как избежать перегрузки метода? - PullRequest
5 голосов
/ 12 июля 2011

У меня следующая ситуация:

Конструктор принимает 6 значений. Некоторые из них имеют значения по умолчанию, некоторые нет.

#pseudocode# Foo(int a, int b=2, int c=3, int d=4, int e=5, int f){}

И я хочу иметь возможность вызывать все возможные комбинации без необходимости записывать все 6 параметров.

#pseudocode# Foo f1 = new Foo(a=1, d=7, f=6);
#pseudocode# Foo f2 = new Foo(a=1, b=9, d=7, f=6);

Помимо этого с перегрузкой метода (что было бы утомительно), есть ли более элегантное решение?

Ответы [ 4 ]

12 голосов
/ 12 июля 2011

в C # 4, есть именованные параметры, см. Именованные и необязательные аргументы (Руководство по программированию в C #)

, что приведет к

new Foo(a: 1, d: 7, f: 6);

Другое решение будетчтобы определить конструктор с вашим значением по умолчанию и использовать Object Initializer, чтобы установить значения Как: Инициализировать объекты с помощью Object Initializer (Руководство по программированию в C #)

new Foo()
{
    a = 1,
    d = 7,
    f = 6
};
1 голос
/ 12 июля 2011

Я бы предпочел рефакторинг объекта Параметр . Что-то вроде:

Foo f1 = new Foo (new FooParameters () { B = 7 })

И ваш класс FooParamaters может инкапсулировать значения по умолчанию:

public class FooParameters
{
     public int A { get; set; }
     public int B { get; set; }


     public FooParameters ()
     {
          A = 1;
          B = 2;
     }
}
1 голос
/ 12 июля 2011

используйте следующее для именования аргументов:

Foo f1 = new Foo(a: 1, d: 7, f: 6);
Foo f2 = new Foo(a: 1, b: 9, d: 7, f: 6);

Более подробная информация об Именных и Необязательных Аргументах доступна здесь:

http://msdn.microsoft.com/en-us/library/dd264739.aspx#Y515

0 голосов
/ 12 июля 2011

2 вещи:

1) параметры по умолчанию слева направо, после того, как вы начнете задавать параметры по умолчанию, после них вы не сможете использовать значения по умолчанию, поэтому f должно иметь значение по умолчанию (в вашем примере)

2) вы можете использовать именование параметров, чтобы пропустить параметр по умолчанию:

var f1 = new Foo(5, 9, e: 9, f: 10);

Это дает a = 5, b = 9, c = значение по умолчанию, d= по умолчанию, e = по умолчанию, f = 10

При условии, что вы используете компилятор C # 4.0, конечно ...

...