Sobrecarga de métodos
Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy — lección 50 de 70.
Sobrecarga de métodos le permite definir múltiples métodos con el mismo nombre pero con diferentes listas de parámetros. El compilador determina qué versión llamar basándose en los argumentos que usted proporcione.
Cada método sobrecargado debe tener una firma única, ya sea un número diferente de parámetros o diferentes tipos de parámetros:
public static void Print(string message)
{
Console.WriteLine(message);
}
public static void Print(string message, int times)
{
for (int i = 0; i < times; i++)
Console.WriteLine(message);
}
public static void Print(int number)
{
Console.WriteLine(number);
}// El compilador elige la versión correcta
Print("Hello"); // Llama a Print(string)
Print("Hi", 3); // Llama a Print(string, int)
Print(42); // Llama a Print(int)La sobrecarga se diferencia de los parámetros opcionales de una manera importante. Con los parámetros opcionales, tienes un único método que maneja múltiples escenarios. Con la sobrecarga, tienes métodos separados que pueden contener una lógica completamente diferente para cada caso.
Ten en cuenta que el tipo de retorno por sí solo no hace que los métodos sean únicos: no puedes tener dos métodos que se diferencien solo por lo que devuelven. La lista de parámetros debe ser diferente. La sobrecarga de métodos es una forma de polimorfismo en tiempo de compilación, donde la decisión sobre qué método llamar se toma cuando se compila el código, no cuando se ejecuta.
Desafío
FácilVamos a construir una clase de calculadora versátil que demuestre el poder de la sobrecarga de métodos. Crearás múltiples versiones de métodos de cálculo que manejan diferentes escenarios, desde operaciones simples de dos números hasta cálculos más complejos, todos compartiendo los mismos nombres de métodos intuitivos.
Organizarás tu código en dos archivos:
Calculator.cs: Crea una claseCalculatoren el espacio de nombresMathToolscon métodos sobrecargados que comparten nombres pero aceptan diferentes parámetros:Multiply- Crea tres versiones sobrecargadas:- Una que toma dos parámetros
inty devuelve su producto como unint - Una que toma tres parámetros
inty devuelve su producto como unint - Una que toma dos parámetros
doubley devuelve su producto como undouble
- Una que toma dos parámetros
Describe- Crea dos versiones sobrecargadas:- Una que toma un
inty devuelve"Integer: {value}" - Una que toma un
doubley devuelve"Double: {value}"
- Una que toma un
Program.cs: En tu archivo principal, crea una instancia deCalculatory demuestra cómo el compilador selecciona automáticamente el método sobrecargado correcto basándose en los argumentos que proporciones.
Recibirás cuatro entradas:
- Primer entero (por ejemplo,
5) - Segundo entero (por ejemplo,
4) - Tercer entero (por ejemplo,
3) - Un número decimal (por ejemplo,
2.5)
Usando tu calculadora, realiza estas operaciones e imprime cada resultado en su propia línea:
- Multiplica los dos primeros enteros (usa la versión de dos int)
- Multiplica los tres enteros (usa la versión de tres int)
- Multiplica el primer entero y el número decimal (usa la versión de dos double)
- Describe el primer entero (usa la versión int)
- Describe el número decimal (usa la versión double)
Por ejemplo, si las entradas son 5, 4, 3, y 2.5, la salida debería ser:
20
60
12.5
Integer: 5
Double: 2.5Observa cómo llamas a Multiply y Describe con diferentes tipos y cantidades de argumentos, y aun así el compilador sabe exactamente qué versión usar cada vez. ¡Esto es polimorfismo en tiempo de compilación en acción: la decisión ocurre cuando se compila tu código, no cuando se ejecuta!
Hoja de referencia
La sobrecarga de métodos permite definir múltiples métodos con el mismo nombre pero con diferentes listas de parámetros. El compilador determina qué versión llamar basándose en los argumentos proporcionados.
Cada método sobrecargado debe tener una firma única, ya sea un número diferente de parámetros o diferentes tipos de parámetros:
public static void Print(string message)
{
Console.WriteLine(message);
}
public static void Print(string message, int times)
{
for (int i = 0; i < times; i++)
Console.WriteLine(message);
}
public static void Print(int number)
{
Console.WriteLine(number);
}
// El compilador elige la versión correcta
Print("Hello"); // Llama a Print(string)
Print("Hi", 3); // Llama a Print(string, int)
Print(42); // Llama a Print(int)Puntos clave sobre la sobrecarga de métodos:
- La sobrecarga difiere de los parámetros opcionales: con la sobrecarga, se tienen métodos separados que pueden contener una lógica completamente diferente para cada caso
- El tipo de retorno por sí solo no hace que los métodos sean únicos; la lista de parámetros debe ser diferente
- La sobrecarga de métodos es una forma de polimorfismo en tiempo de compilación, donde la decisión sobre qué método llamar se toma cuando se compila el código, no cuando se ejecuta
Pruébalo tú mismo
using System;
using MathTools;
class Program
{
public static void Main(string[] args)
{
// Leer entradas
int firstInt = Convert.ToInt32(Console.ReadLine());
int secondInt = Convert.ToInt32(Console.ReadLine());
int thirdInt = Convert.ToInt32(Console.ReadLine());
double decimalNum = Convert.ToDouble(Console.ReadLine());
// TODO: Crear una instancia de Calculator
// TODO: Llamar a Multiply con dos enteros e imprimir el resultado
// TODO: Llamar a Multiply con tres enteros e imprimir el resultado
// TODO: Llamar a Multiply con el primer entero y el número decimal, imprimir el resultado
// TODO: Llamar a Describe con el primer entero e imprimir el resultado
// TODO: Llamar a Describe con el número decimal e imprimir el resultado
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosNamespaces y directivasIntro a clases y objetosLa palabra clave 'this'Métodos y parámetrosCampos vs PropiedadesConstructoresInicializadores de objetosResumen - Calculadora simple4Herencia
Sintaxis básica de herencia (:)La palabra clave 'base'Palabras clave Virtual y OverrideClases selladas (Sealed)La clase base 'object'Resumen: Jerarquía de empleados7Características avanzadas
Sobrecarga de operadoresIndexadores (this[])Sobrescritura de ToString()Métodos de extensiónResumen - Lista personalizada10Patrones de diseño - Parte 1
Introducción a los patrones de diseñoSingleton Thread-SafePatrón FactoryPatrón Observer (Eventos)Patrón Strategy2Propiedades y miembros estáticos
Propiedades autoimplementadasPropiedades de solo lectura y escrituraCampos y métodos estáticosClases estáticasMiembros con cuerpo de expresión5Polimorfismo e Interfaces
Polimorfismo: Compilación vs. EjecuciónInterfaz vs. Clase AbstractaInterfaces MúltiplesInterfaces ExplícitasUpcasting y DowncastingRepaso: Calculadora de Figuras8Conceptos avanzados de POO
Composición sobre herenciaGenéricos (clases y métodos)Delegados y eventosAtributos y ReflexiónIDisposable y la sentencia usingFundamentos de Inyección de dependencias11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Arquitectura de clases
Datos de instancia vs. estáticosPalabras clave 'readonly' y 'const'Campos de respaldoResumen - Gestor de cuentas bancarias6Encapsulamiento
Modificadores de accesoPropiedades para el encapsulamientoImplementación de ocultamiento de datosPatrones de inmutabilidadRepaso - Registros de estudiantes9Argumentos variables
La palabra clave 'params'Parámetros opcionalesArgumentos con nombreSobrecarga de métodos