Проблема перегрузки метода в c # - PullRequest
0 голосов
/ 30 июля 2011

В интервью они задали вопрос, подобный этому, есть три метода перегрузкиметод, можем ли мы действительно сделать что-то подобное в OOPS

любая помощь будет отличной

Спасибо

Ответы [ 3 ]

1 голос
/ 30 июля 2011

Да, с использованием дженериков:

public T Addtoatal<T>(T a, T b) {}

Если метод должен использовать какие-либо операторы (+, -, *) и т. Д., Это будет проблематично, поскольку универсальные типы не могут гарантировать, что класс T имеет оператор (операторы не могут быть объявлены в интерфейсах, и поэтому Вы не можете сделать ограничение, чтобы соответствовать).
В .Net 4.0 вы можете использовать динамическую типизацию, чтобы получить динамическую переменную, содержащую результат, и добавить к ней:

public T Addtoatal<T>(T a, T b) {
   dynamic res = a;
   a += b;
   return res;
}

В других версиях .Net вам нужно будет обойти, например, класс Operator в MiscUtils: универсальный метод для добавления int, float, в c #


Второй пример с тремя параметрами должен иметь другую подпись (в .Net 2.0), поскольку он имеет больше параметров.

в .Net 4.0 вы можете просто использовать необязательные параметры для универсальных типов, но не можете сделать это для типов значений:

public T Addtoatal<T>(T a, T b, T c = null) where T: class { //Do stuff }

Но вы можете использовать бокс с обнуляемыми типами, это будет работать с int и double:

public T Addtoatal<T>(T? a, T? b, T? c = null) where T : struct { //Do stuff, use .Value }

Теперь следующая лучшая вещь, которую вы могли бы сделать, если вы не хотите использовать обобщения, - это иметь одно объявление метода как double (C # 4.0, из-за необязательного параметра):

public double Addtoatal(double  a, double  b, double c = 0) {}

В этом примере значения int в любом случае будут преобразованы в double, поэтому потеря данных не будет, и int может быть неявно преобразован в double, но возвращаемое значение необходимо будет явно привести к int.

0 голосов
/ 22 ноября 2017

Вы можете сделать это с универсальными типами и для возможности различных параметров вы можете использовать params ссылку, и не имеет значения, сколько параметров вы хотите передать.

    private T Addtoatal<T>(params T[] items)
    {
        dynamic total = 0;
        foreach (dynamic item in items)
        {
            total += item;
        }
        return total;
    }

Usage;

var total = Addtoatal<float>(1, 2, 3, 4, 5, 6);
var total = Addtoatal<int>(1, 2, 3);
0 голосов
/ 30 июля 2011

Да, это называется общим программированием, см. http://en.wikipedia.org/wiki/Generic_programming#Generic_programming_in_.NET

...