Ir al contenido
wannacode

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));
Salida
6.5
8

En 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
  1. Una llamada con dos argumentos: Total(2.5, 4.0).
  2. Hay dos métodos con un mismo nombre. El compilador cuenta los argumentos: dos. Encaja el método de dos parámetros.
  3. Los argumentos entran en a y b. El método devuelve 6.5.
  4. Ahora hay tres argumentos.
  5. Encaja el otro método, el de tres parámetros. Devuelve 8.
  6. 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);
Respuesta

Pruébalo

Encuentra el error

El programa no compila. ¿En qué línea está el problema?

Elige la línea con el error.

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());
Salida
11
9.99
0

La 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;
}

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.

Llamadas
Max(3, 8)
Max(4, 9, 2)
Max(2.5, 1.5)
Salida
8
9
2.5

2. Nota media. El método Average(params int[] grades) devuelve la media de cualquier número de notas, y sin notas devuelve 0.

Llamadas
Average(5, 6, 4)
Average(6, 5)
Average()
Salida
5
5.5
0

3. 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.

Salida
Café x 2
Cruasán x 1

Test

Ponte a prueba

1. ¿Cuándo pueden llamarse igual dos métodos de una misma clase?
2. ¿Cómo elige el compilador a cuál de los métodos sobrecargados llamar?
3. ¿Qué es params double[] prices dentro del método?
4. ¿Cuál de estos NO compila?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·