В перегрузке метода действительно ли возможно иметь различные типы возврата для перегруженного метода? например,
void foo(int x) ;
int foo(int x,int y);
double foo(String str);
в общем объектно-ориентированном программировании действительно ли это возможно?
Пока вы не делаете ничего подобного:
int foo (int i, int has_default=0);
double foo (long l);
/* Skipping to the function call. */
foo (1);
все должно быть в порядке. Приведенный выше код вызовет проблемы, потому что он может пытаться вызвать любую функцию. Это может быть очень плохо, если вы используете C++ и возвращаете указатели вместо примитивов или ссылок...
В классе может быть несколько методов, имеющих одинаковое имя, но различающихся
В зависимости от параметров, предоставленных для метода, во время выполнения компилятор определяет, какую версию метода следует выполнить.
Перегруженный метод может иметь или не иметь различные типы возврата. Но одного типа возврата недостаточно, чтобы компилятор определил, какой метод будет выполняться во время выполнения.
Посмотрите этот замечательный ответ, Перегрузка функций по возвращаемому типу?
Короче говоря, большинство статически типизированных языков не делают этого, но некоторые динамически типизированные языки могут.
Edit: Ответ "Вкратце" относится к перегрузке строго по возвращаемому типу. Как отмечали другие, если списки параметров отличаются и могут быть разрешены компилятором, то каждый метод может возвращать другой тип. В ADA возможно перегружать методы только по возвращаемому типу, поскольку возвращаемое значение нельзя игнорировать, и компилятор может разрешить вызов метода, используя эту информацию.
Для большинства языков программирования, поддерживающих перегрузку методов (Java, C#, C++, ...), если типы параметров разные, то и возвращаемые типы могут быть разными.