Sobrecarga
En resumen: La sobrecarga son varios métodos con el mismo nombre y parámetros distintos; el compilador elige a cuál llamar según el número y el tipo de los argumentos.
Problema
Dos productos, tres productos
La caja tiene que sumar los precios de los productos. A veces son dos, a veces tres. El método significa lo mismo en los dos casos: «suma». ¿Cómo lo escribes para ambos casos sin inventarte nombres como Total2 y Total3?
Una pista: ya usas un método que acepta cosas distintas. Console.WriteLine imprime 5, 2.5 y también texto. ¿Cómo lo hace?
La idea
Un nombre, parámetros distintos
Dos métodos pueden llamarse igual si sus parámetros se diferencian: en número, en tipo o en orden. Esto se llama sobrecarga (overloading).
static double Total(double a, double b){ return a + b;}
static double Total(double a, double b, double c){ return a + b + c;}
Console.WriteLine(Total(2.5, 4.0));Console.WriteLine(Total(2.5, 4.0, 1.5));6.58En cada llamada, el compilador mira los argumentos y elige el método que encaja. Dos argumentos: el primer método. Tres: el segundo. Por eso WriteLine funciona con todo: son muchos métodos con un mismo nombre.
static double Total(double a, double b){ return a + b;}
static double Total(double a, double b, double c){ return a + b + c;}
Console.WriteLine(Total(2.5, 4.0));Console.WriteLine(Total(2.5, 4.0, 1.5));Paso a paso, en palabras
- Una llamada con dos argumentos: Total(2.5, 4.0).
- Hay dos métodos con un mismo nombre. El compilador cuenta los argumentos: dos. Encaja el método de dos parámetros.
- Los argumentos entran en a y b. El método devuelve 6.5.
- Ahora hay tres argumentos.
- Encaja el otro método, el de tres parámetros. Devuelve 8.
- Un nombre, dos métodos. Los argumentos deciden a cuál se llama.
Pruébalo
¿Qué método?
¿Qué imprimirá el programa?
static void Describe(int x){ Console.WriteLine("entero: " + x);}
static void Describe(double x){ Console.WriteLine("decimal: " + x);}
Describe(5);Describe(5.0);Describe(7 / 2);5 es un int, 5.0 es un double. Y 7 / 2 divide dos números enteros: el resultado es el número entero 3, así que se llama al método para int.
Pruébalo
Encuentra el error
El programa no compila. ¿En qué línea está el problema?
Elige la línea con el error.
Los dos métodos tienen los mismos parámetros (int percent) y solo se diferencian en el tipo del resultado. En la llamada Discount(15) el compilador no tiene forma de elegir. El segundo nombre tiene que ser distinto, por ejemplo DiscountRate.
La idea
Tantos argumentos como quieras
¿Y si los productos son cinco? ¿Veinte? No escribes un método para cada cantidad. Dices que el método acepta un número variable de argumentos de un mismo tipo:
static double Total(params double[] prices){ double sum = 0; foreach (double p in prices) { sum += p; } return sum;}
Console.WriteLine(Total(1.5, 2.0, 3.5, 4.0));Console.WriteLine(Total(9.99));Console.WriteLine(Total());119.990La palabra params delante del array (params double[] prices) significan: «pasa tantos números como quieras». Dentro del método llegan como un array, que también puede estar vacío.
Más precisamente, para curiosos
- Solo puede haber un parámetro así, y tiene que ser el último:
Print(string title, params double[] prices). - Si hay un método con exactamente dos parámetros y también uno con un número variable, una llamada con dos argumentos va al primero. Gana la coincidencia exacta.
Pruébalo
¿Qué falta?
static double Total( double[] prices)
{
double sum = 0;
foreach (double p in prices)
{
sum += p;
}
return sum;
}params double[] prices: la palabra params delante del array.Ejercicio
Un nombre, varios métodos
1. El mayor. Escribe tres métodos con un mismo nombre, Max: para dos números enteros, para tres números enteros (llama dos veces al primero) y para dos decimales.
Max(3, 8)Max(4, 9, 2)Max(2.5, 1.5)892.52. Nota media. El método Average(params int[] grades) devuelve la media de cualquier número de notas, y sin notas devuelve 0.
Average(5, 6, 4)Average(6, 5)Average()55.503. Una línea del recibo. PrintLine(string item, int qty) imprime «Café x 2». Añade PrintLine(string item) para una sola unidad. No repite el código: llama al primer método con 1.
Café x 2Cruasán x 1Test
Ponte a prueba
Lecciones relacionadas
Sección «Lecciones relacionadas»- Se basa en: Bucles · Arrays · Métodos · Parámetros y return
- Continúa en: Constructores y this · Principios de la POO · Dictionary y HashSet · Composite
- Ejercicios sobre el tema: Métodos