Возможно ли иметь разные типы возвращаемых данных для перегруженного метода? - PullRequest
25 голосов
/ 11 мая 2010

При перегрузке метода возможно ли иметь разные типы возврата для перегруженного метода? например,

void foo(int x) ;
int foo(int x,int y);
double foo(String str);

в общем объектно-ориентированном программировании это возможно?

Ответы [ 11 ]

34 голосов
/ 11 мая 2010

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

  1. Типы параметров
  2. Количество параметров
  3. Порядок параметров, заявленных в методе

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

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

17 голосов
/ 22 марта 2015

Невозможно иметь метод с такими же параметрами и другим типом return. Компилятор throws error в приведенном ниже случае (дублирующий метод).

Метод 1:

public int calc(int a, int b, int c)

Метод 2:

public String calc(int e, int f, int g)

Ошибка выдана:

method calc(int, int, int) is already defined
16 голосов
/ 09 июля 2015

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

Важные пункты

  • Перегруженные методы ДОЛЖНЫ изменить список аргументов
  • перегруженные методы МОГУТ изменить тип возвращаемого значения
  • Перегруженные методы МОГУТ изменить модификатор доступа
  • перегруженные методы МОГУТ объявить новые или более широкие проверенные исключения
  • Метод может быть перегружен в том же классе или в подклассе
2 голосов
/ 15 июня 2017

Это недопустимо для перегрузки. Вы можете только перегрузить, изменив список параметров. Изменение только возвращаемого типа недопустимо для перегрузки метода, так как возвращаемый тип не является частью сигнатуры метода (только имя метода и список параметров находятся в сигнатуре метода).

1 голос
/ 08 июля 2015
Integer doSomething(){return null;}
String doSomething(){return null;}

main(){
    doSomething()
}

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

Примечание. Перегрузка метода проверяется во время компиляции.

1 голос
/ 02 сентября 2014

Никакая перегрузка метода невозможна в случае другого возвращаемого типа, потому что компилятор не может понять, какой метод ему нужно вызвать ..

1 голос
/ 11 мая 2010

Пока вы не делаете что-то подобное:

int foo (int i, int has_default=0);
double foo (long l);
/* Skipping to the function call.  */
foo (1);

с тобой должно быть все в порядке. Приведенный выше код вызовет проблемы, потому что он может пытаться вызвать любую функцию. Это может быть очень плохо, если вы используете C ++ и вы возвращаете указатели вместо примитивов или ссылок ...

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

Вы можете использовать функцию шаблона Varadic в C ++ Слушайте это пример:

template<typename T>
T adder(T v) {
  return v;
}

template<typename T, typename... Args>
T adder(T first, Args... args) {
  return first + adder(args...);
}

И вот несколько способов, которыми мы могли бы назвать это:

long sum = adder(1, 2, 3, 8, 7);

std::string s1 = "x", s2 = "aa", s3 = "bb", s4 = "yy";
std::string ssum = adder(s1, s2, s3, s4);

Для большей ссылки https://eli.thegreenplace.net/2014/variadic-templates-in-c/

0 голосов
/ 10 марта 2015

да, приведенный вами пример возможен, мы можем выполнить метод ovrloading таким способом в c #

void foo(int x)
    {
    }
    int foo(int x, int y)
    {
        return 0;
    }
    double foo(String str)
    {
        return 1;
    }
0 голосов
/ 11 мая 2010

Проверьте этот удивительный ответ, Перегрузка функции по типу возврата?

Короче говоря, большинство статически типизированных языков этого не делают, но некоторые динамически типизированные языки могут.

Редактировать: Ответ «Короче» относится к перегрузке строго по типу возврата. Как отмечали другие, если списки параметров различаются и могут быть разрешены компилятором, то каждый метод может возвращать свой тип. возможно перегрузить методы только типом возврата в ADA, поскольку возвращаемое значение не может быть проигнорировано, и компилятор может разрешить вызов метода, используя эту информацию.

...