¿Un método sobrecarga a otro, o ambos métodos están "sobrecargados"?

13

Si creo este método

public void foo()

Y luego creo una versión sobrecargada como esta

public void foo( string bar )

¿Decimos que la segunda función sobrecarga a la primera, o ambos métodos están igualmente "sobrecargados"?

Esto implicaría (creo) que hay una función de tipo base que está siendo sobrecargada por otra función (algo así como la herencia, pero en realidad no).

Asumir que un método puede "sobrecargar a otro", también implicaría términos como "sobrecarga" y "sobrecarga", si esa es una palabra. Pero eso no se siente del todo bien, especialmente porque puede tener varias sobrecargas.

Llegué a esta pregunta cuando quería escribir el proceso de creación de un método sobrecargado y quería la forma más correcta de escribirlo.

Ejemplos:

  • Estoy sobrecargando foo
  • Estoy sobrecargado fooconfoo( string bar )
  • Estoy creando un método sobrecargado
  • Estoy haciendo foo sobrecargado

Así que sí, esto me hizo pensar, no estoy seguro de qué hacer con eso. Hay cientos, si no miles, de descripciones de sobrecarga de funciones en línea, pero a primera vista no pude encontrar ninguna que abordara esto.

Willem D'Haeseleer
fuente
Me gustaría saber por qué se usó la palabra sobrecarga para esto. No parece tener ningún sentido. ¿Qué se está cargando? ¿Cómo se carga de nuevo o en exceso?
Martin Maat
@MartinMaat ¿Has leído la respuesta aceptada por thiton y el comentario de Kindall al respecto? Parecen hacer un buen trabajo al explicar qué se está (sobre) cargando.
8bittree
Los he leído, explican el concepto, no la etomología.
Martin Maat

Respuestas:

29

Cuando se habla de sobrecargas, el nombre de la función está sobrecargado, no la función en sí. Las funciones que sobrecargan el nombre son "sobrecargas" y sobrecargan el nombre, pero no entre sí. En su ejemplo, "public void foo()"y "public void foo( string bar )"ambos sobrecargan el nombre "foo". Por lo tanto, no puede hablar en términos de sobrecarga y sobrecarga de una de las funciones, porque no tienen una relación directa.

En sus ejemplos, puede decir que está sobrecargando "foo" (el nombre) con "foo (barra de cadena)" (la función), pero no puede decir que crea un método sobrecargado, porque los métodos nunca se sobrecargan. Puede decir que crea un método de sobrecarga. Formular "hacer que foo se sobrecargue" es solo una forma peor de decir "sobrecargar foo".

thiton
fuente
¿Pero no todas las funciones sobrecargarían su nombre, incluso si ninguna otra función tiene la misma?
Leftaroundabout
Estoy de acuerdo con esto como la respuesta a la pregunta general anterior. Pero si uno llama a una de las funciones del otro, entonces percibo un sentido en el que uno sobrecarga al otro.
Joshua Drake
3
@leftaroundabout: "Sobrecarga" implica que está haciendo más "carga" de lo habitual, por lo que el término solo se usa cuando tiene más de una función con el mismo nombre.
poco
De acuerdo con @kindall; la palabra "sobrecarga" en un contexto de desarrollo de software significa "asignar más de un significado a"; sobrecargar columnas en un DB (el significado depende de otros campos), sobrecargar los parámetros (el significado depende de otros parámetros), etc. Un método no sobrecarga ningún otro, pero si hay más de un método con un nombre , el nombre es " sobrecargado".
KutuluMike
15

Simplemente diría que fooestá sobrecargado. Ciertamente no hay una relación maestro / esclavo o padre / hijo aquí.

DeadMG
fuente
2
De acuerdo: es el nombre del método u operador que está sobrecargado, no el método en sí. No debe confundirse con la anulación , donde la implementación de un método dado en una subclase suplanta la implementación en la clase padre.
Caleb
1
También estoy de acuerdo con esto, pero creo que thiton hace un mejor trabajo al explicarlo. Gracias por su respuesta !
Willem D'Haeseleer
3

Creo que una buena manera de expresar esto es centrarse en el resultado final, no en los cambios realizados en la clase con el tiempo. Por lo tanto, en lugar de decir "Sobrecargué 'foo' con 'foo (otros parámetros)', usted dice" foo es una función sobrecargada, con 'foo ()' y 'foo (otros parámetros)' ".

mjfgates
fuente