que polimorfismo method method-overloading

method-overloading - polimorfismo - overriding java



¿Es posible tener diferentes tipos de retorno para un método sobrecargado? (11)

En la sobrecarga de métodos, ¿es posible tener diferentes tipos de retorno para un método sobrecargado? por ejemplo,

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

En general la programación orientada a objetos, ¿es posible?


Echa un vistazo a esta respuesta impresionante, ¿ Sobrecarga de funciones por tipo de retorno?

En resumen, la mayoría de los idiomas tipificados estáticamente no, pero algunos idiomas tipificados dinámicamente sí.

Edición: La respuesta "En resumen" se aplica a la sobrecarga estrictamente por tipo de devolución. Como otros lo han señalado, si las listas de parámetros difieren y el compilador las puede resolver, entonces cada método puede devolver un tipo diferente. Es posible sobrecargar los métodos solo por el tipo de retorno en ADA, ya que el valor de retorno no se puede ignorar, y el compilador puede resolver la llamada al método utilizando esta información.


En una clase, puede haber varios métodos que comparten el mismo nombre pero difieren en

  1. Tipos de parametros
  2. Numero de parametros
  3. Orden de los parámetros declarados en el método.

Al depender de los parámetros proporcionados para el método, en el tiempo de ejecución, el compilador determina qué versión del método ejecutar.

Un método sobrecargado puede o no tener diferentes tipos de devolución. Pero el tipo de retorno solo no es suficiente para que el compilador determine qué método se ejecutará en el tiempo de ejecución.


Esto no es válido para la sobrecarga. Solo se puede sobrecargar cambiando la lista de parámetros. El cambio del tipo de retorno solo no es válido para la sobrecarga de métodos, ya que el tipo de retorno no es parte de la firma del método (solo el nombre del método y la lista de parámetros están en la firma del método).


Método de sobrecarga significa tener dos o más métodos con el mismo nombre en la misma clase con diferentes argumentos. El beneficio de la sobrecarga de métodos es que le permite implementar métodos que admiten la misma operación semántica pero que difieren según el número o tipo de argumento.

Puntos importantes

  • Los métodos sobrecargados DEBEN cambiar la lista de argumentos
  • Los métodos sobrecargados pueden cambiar el tipo de retorno
  • Los métodos sobrecargados pueden cambiar el modificador de acceso
  • Los métodos sobrecargados PUEDEN declarar excepciones revisadas nuevas o más amplias
  • Un método se puede sobrecargar en la misma clase o en una subclase

Mientras no hagas algo como esto:

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

deberías estar bien El código anterior causará problemas porque podría estar intentando llamar a cualquiera de las funciones. Puede ser realmente malo si está utilizando C ++, y devuelve punteros en lugar de primitivos o referencias ...


Ningún método de sobrecarga no es posible en el caso de un tipo de retorno diferente, ya que el compilador no puede determinar a qué método debe llamar.


No es posible tener un método con los mismos parámetros y diferente tipo de return . El compilador throws error en el caso siguiente (método duplicado).

Método 1:

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

Método 2:

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

Error lanzado:

method calc(int, int, int) is already defined


Para la mayoría de los lenguajes de programación que admiten la sobrecarga de métodos (Java, C #, C ++, ...), si los tipos de parámetros son diferentes, entonces los tipos de retorno también pueden ser diferentes.


Puede usar la función de plantilla Varadic de C ++. Hear es el ejemplo:

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

Y aquí hay un par de maneras en que podríamos llamarlo:

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);

Para obtener más información, visite https://eli.thegreenplace.net/2014/variadic-templates-in-c/


sí, el ejemplo dado por usted es posible. Podemos hacer el método de descarga de esta manera en c #

void foo(int x) { } int foo(int x, int y) { return 0; } double foo(String str) { return 1; }


Integer doSomething(){return null;} String doSomething(){return null;} main(){ doSomething() }

En este caso, el compilador nunca sabrá qué método invocar.

Nota: la sobrecarga del método se verifica durante el tiempo de compilación