Есть ли более простой способ создания перегрузки для методов в C #? - PullRequest
4 голосов
/ 09 июля 2011

Это скорее общее сомнение в программировании, чем конкретное. Но я бы изложил это на примере. Предположим, я создаю собственный класс MessageBox и хочу, чтобы метод .Show() был реализован, скажем, с 21 перегрузкой. Я могу сделать это, как показано ниже.

public static void Show(string x){}
public static void Show(int x){}
public static void Show(param x){}
public static void Show(param2 x){}
public static void Show(string x, param y){}
.
.
.
.
public static void Show(param x, param y){}

Написание 21 такого метода становится довольно сложной задачей. Есть ли более простой способ сделать это? Что-то вроде

public static void Show(string x, string y, int i, param p, ...... param21st z)
{
    if (//see the arguments and decide)
        //do stuff ignoring rest of the arguments;
    else if (//passed arguments are of these type)
        //then do this stuff.
    else if (so and so)
        // so and so.
}

Примечание: 1. Я знаю, что могут быть аргументы, как если бы это не делало мою единственную функцию настолько большой, что она могла бы превышать размер отдельно написанных 21 различных функций Нет. В моем случае писать отдельно - это большая проблема, учитывая, что то, что мне нужно выполнить под функцией, очень тривиально (только то, что функция может принимать большое количество параметров). Кроме того, этот вопрос также должен знать о различных методах кодирования. 2. Я понимаю, что лаконичный стиль, который я ищу, имеет свои недостатки, в моем случае это программа для хобби, которую я создаю для себя. Так что не имеет значения юзабилити. Просто мне нужно выполнить .Show() метод с каждой комбинацией параметров, которые можно передать. (Это делает написание отдельных функций таким утомительным).

Спасибо.

Ответы [ 2 ]

5 голосов
/ 09 июля 2011

Вы можете сделать это, но вам нужно будет знать тип параметров в функции.

public static void Show(params object[] values)
{
   if(values[0] == "something")
   //Do stuff
}
4 голосов
/ 09 июля 2011

Два хороших варианта, которые я вижу: 1. Необязательные параметры и 2. Наличие методов, вызывающих друг друга по мере необходимости.И то, и другое значительно сократит объем кода, который вам нужно написать.

Вот пример необязательных параметров (VS 2010 или более поздняя версия).В string x = "", "" является значением по умолчанию для x.Значения по умолчанию должны быть константами времени компиляции.

public static void Show(string x = "", string y = null, int i = 0, param p = null, ...... param21st z = null)
{
    if (//see the arguments and decide)
        //do stuff ignoring rest of the arguments;
    else if (//passed arguments are of these type)
        //then do this stuff.
    else if (so and so)
        // so and so.
}

Когда вы вызываете его, если вы не включаете все параметры, вам может потребоваться дать им имена, чтобы компилятору было ясно, что вы есть и не 'Указание:

CustomMessageBox.Show(x: "hi", y: "there", p: myObject);

Это на самом деле трюк компилятора, который автоматически заполняет все не включенные параметры их значениями по умолчанию.

Другой вариант - заставить методы вызывать друг друга каквозможный.Таким образом, вы не дублируете код 21 раз, как много разных способов его запуска.

public static void Show(string x){Show(x, null);}
public static void Show(int x){//do something}
public static void Show(param x){Show(string.Empty, x);}
public static void Show(param2 x){//do something}
public static void Show(string x, param y){//do something}

Преимущество такого способа состоит в том, что вы можете передавать вещи помимо констант, такие как newэкземпляры объектов или статических объектов только для чтения.

...