Você está na página 1de 5

2.

6 Sobrecarga de Mtodos Concepto de mtodo Un mtodo es un conjunto de instrucciones a las que se les da un determinado nombre de tal manera que sea posible ejecutarlas en cualquier momento sin tenerlas que rescribir sino usando slo su nombre. A estas instrucciones se les denomina cuerpo del mtodo, y a su ejecucin a travs de su nombre se le denomina llamada al mtodo. La ejecucin de las instrucciones de un mtodo puede producir como resultado un objeto de cualquier tipo. A este objeto se le llama valor de retorno del mtodo y es completamente opcional, pudindose escribir mtodos que no devuelvan ninguno. La ejecucin de las instrucciones de un mtodo puede depender del valor de unas variables especiales denominadas parmetros del mtodo, de manera que en funcin del valor que se d a estas variables en cada llamada la ejecucin del mtodo se pueda realizar de una u otra forma y podr producir uno u otro valor de retorno. Firmas de mtodo Al conjunto formado por el nombre de un mtodo y el nmero y tipo de sus parmetros se le conoce como firma del mtodo. La firma de un mtodo es lo que verdaderamente lo identifica, de modo que es posible definir en un mismo tipo varios mtodos con idntico nombre siempre y cuando tengan distintos parmetros. Cuando esto ocurre se dice que el mtodo que tiene ese nombre est sobrecargado. Tomar en cuenta que lo que diferencia las listas de parmetros de las diferentes sobrecargas no es el nombre de las variables, sino el tipo de cada una de ellas. Un tipo de valor devuelto desde un mtodo no forma parte de su firma a efectos de la sobrecarga de mtodos. Sin embargo, s forma parte de la firma del mtodo a la hora de determinar la compatibilidad entre un delegado y el mtodo al que apunta. Concepto de Sobrecarga de mtodos En C# es posible definir varios mtodos con el mismo nombre pero con distintos parmetros, de forma que el compilador decide a cul se llama dependiendo de los parmetros que le lleguen. Por ejemplo: Distinto nmero de parmetros. Mismo nmero de parmetros pero tipos diferentes. Mismo numero de parmetros pero orden diferente.

Esto es muy prctico, pues no tienes que renombrar cada funcin segn el tipo de valor que acepta. El siguiente ejemplo implementa un par de mtodos que elevan al cuadrado el valor que reciben, y se implementan para tipos double y para int. En otros lenguajes que no soportan sobrecarga de mtodos, se tendra que haber llamado distinto a ambos mtodos, por ejemplo alcuadrado_double y alcuadrado_int. 1

class Eleva{ public static double AlCuadrado( int a ) { return a*a; } public static double AlCuadrado( double a ) { return a*a; } } public class UsaEleva { public static void main(String[] args) { System.out.printf("4 al cuadrado es %f\n", Eleva.AlCuadrado(4) ); System.out.printf("3.2 al cuadrado es %f\n", Eleva.AlCuadrado(3.2) ); } } Otro ejemplo con el mismo nmero de parmetros pero de tipos diferentes: class Sumador { long suma(int x, int y) { System.out.printf("\nSuma de enteros = "); return x + y; } double suma(double x, double y) { System.out.printf("\nSuma de dobles = "); return (x + y); } } class UsaSumador { public static void main(String[] args) { long sumaEnt; double sumaDob; Sumador unObjeto = new Sumador(); sumaEnt = unObjeto.suma(2, 3); System.out.println(sumaEnt); sumaDob = unObjeto.suma(2.55, 3.66); System.out.println(sumaDob); } } Ejemplo de sobrecarga con igual numero de parmetros pero diferente orden. class Empleado { private int clave ; 2

private String nombre ; private float sueldo ; public Empleado(int c, String n, float s) { clave = c; nombre= n; sueldo= s; } public Empleado(int c, float s, String n) { clave = c; nombre= n; sueldo= s; } public Empleado(String n, int c, float s) { clave = c; nombre = n; sueldo = s; } public Empleado(String n, float s, int c) { clave = c; nombre = n; sueldo = s; } public Empleado(float s, int c, String n) { clave = c; nombre = n; sueldo = s; } public Empleado(float s, String n, int c) { clave = c; nombre = n; sueldo = s; } public int devClave() { return clave; } public String devNombre() { return nombre; } public float devSueldo() { return sueldo; } } class UsaEmpleado { public static void main(String[] args) { 3

Empleado e1 = new Empleado(101, "Hugo", 10000F); Empleado e2 = new Empleado("Paco", 102, 8000F); Empleado e3 = new Empleado(5000F, "Luis", 103); Empleado e4 = new Empleado(104, 0.5F, "Tio Rico"); Empleado e5 = new Empleado(1000F, 105, "Donald"); Empleado e6 = new Empleado("Chico Malo #1", 2.0F, 106); System.out.printf("%s %s recibe %f pesos.\n", e1.devClave(), e1.devNombre(), e1.devSueldo()); System.out.printf("%s %s recibe %f pesos.\n", e2.devClave(), e2.devNombre(), e2.devSueldo()); System.out.printf("%s %s recibe %f pesos.\n", e3.devClave(), e3.devNombre(), e3.devSueldo()); System.out.printf("%s %s recibe %f pesos.\n", e4.devClave(), e4.devNombre(), e4.devSueldo()); System.out.printf("%s %s recibe %f pesos.\n", e5.devClave(), e5.devNombre(), e5.devSueldo()); System.out.printf("%s %s recibe %f pesos.\n", e6.devClave(), e6.devNombre(), e6.devSueldo()); } } El mtodo System.out.print tiene 9 sobrecargas:
public public public public public public public public public public void void void void void void void void void void println() println(boolean x) println(char x) println(int x) println(long x) println(float x) println(double x) println(char[] x) println(String x) println(Object x)

Resolviendo ambiguedades Supongamos que se tiene las dos sobrecargas siguiente que se diferencian por el orden de los parmetros: public Empleado(int cla, string nom, float sue) { clave = cla; nombre= nom; sueldo= sue; } public Empleado(float sue, string nom, int cla) { 4

clave = cla; nombre= nom; sueldo= sdo; } Veamos que sucedera si se escribe la siguiente llamada: Empleado e1 = new Empleado( 101, "Hugo", 10000); Al compilar se presenta el error: reference to UsaSobrecarga is ambiguous, both method UsaSobrecarga(int,java.lang.String,float) in UsaSobrecarga and method UsaSobrecarga(float,java.lang.String,int) in UsaSobrecarga match indicando que la llamada es ambigua entre los mtodos: UsaSobrecarga(int,java.lang.String,float) UsaSobrecarga(float,java.lang.String,int). Efectivamente, aqu podra haber dudas, ya que los nmeros 101 y 10000 puede ser tanto enteros como doubles. En ese caso tendramos que aadir un sufijo al nmero para indicarle al compilador cul es el tipo de dato que debe aplicar para el argumento: Empleado e1 = new Empleado( 101, "Hugo", 10000F);

Los sufijos para literales de los distintos tipos de datos numricos son los siguientes: L (mayscula o minscula) Long Unsigned long, en este orden U (mayscula o minscula) Int Unsigned int, en este orden UL LU (independientemente de que est Unsigned long (Entero largo sin signo) en maysuculas o minsculas) F (mayscula o minscula) Punto flotante de simple precisin D (mayscula o minscula) Punto flotante de doble precisin M (mayscula o minscula) Decimal