El polimorfismo es uno de los pilares fundamentales de la Programación Orientada a Objetos (POO). En términos simples, el polimorfismo permite que una entidad, como una función o un objeto, tome múltiples formas. En C#, el polimorfismo se puede lograr principalmente a través de la herencia y las interfaces.
Conceptos Clave
- Polimorfismo en Tiempo de Compilación (Sobrecarga de Métodos)
- Polimorfismo en Tiempo de Ejecución (Sobrescritura de Métodos)
- Uso de Interfaces para Polimorfismo
- Clases Abstractas y Polimorfismo
Polimorfismo en Tiempo de Compilación
El polimorfismo en tiempo de compilación se logra mediante la sobrecarga de métodos. Esto significa que puedes tener múltiples métodos con el mismo nombre pero con diferentes parámetros.
Ejemplo de Sobrecarga de Métodos
public class Calculadora { // Método para sumar dos enteros public int Sumar(int a, int b) { return a + b; } // Método para sumar tres enteros public int Sumar(int a, int b, int c) { return a + b + c; } // Método para sumar dos números de punto flotante public double Sumar(double a, double b) { return a + b; } }
En este ejemplo, la clase Calculadora
tiene tres métodos Sumar
con diferentes firmas. El compilador decide cuál método llamar en función de los argumentos proporcionados.
Polimorfismo en Tiempo de Ejecución
El polimorfismo en tiempo de ejecución se logra mediante la sobrescritura de métodos. Esto permite que una subclase proporcione una implementación específica de un método que ya está definido en su clase base.
Ejemplo de Sobrescritura de Métodos
public class Animal { public virtual void HacerSonido() { Console.WriteLine("El animal hace un sonido"); } } public class Perro : Animal { public override void HacerSonido() { Console.WriteLine("El perro ladra"); } } public class Gato : Animal { public override void HacerSonido() { Console.WriteLine("El gato maúlla"); } }
En este ejemplo, Perro
y Gato
sobrescriben el método HacerSonido
de la clase base Animal
. La palabra clave override
se utiliza para indicar que el método está sobrescribiendo una implementación en la clase base.
Uso de Polimorfismo en Tiempo de Ejecución
Animal miAnimal; miAnimal = new Perro(); miAnimal.HacerSonido(); // Salida: El perro ladra miAnimal = new Gato(); miAnimal.HacerSonido(); // Salida: El gato maúlla
Aquí, la variable miAnimal
puede referirse a un objeto de tipo Perro
o Gato
, y el método HacerSonido
se llama en función del tipo real del objeto al que se refiere miAnimal
.
Uso de Interfaces para Polimorfismo
Las interfaces también permiten el polimorfismo. Una interfaz define un contrato que las clases pueden implementar.
Ejemplo de Interfaces
public interface IVehiculo { void Conducir(); } public class Coche : IVehiculo { public void Conducir() { Console.WriteLine("Conduciendo un coche"); } } public class Bicicleta : IVehiculo { public void Conducir() { Console.WriteLine("Conduciendo una bicicleta"); } }
Uso de Polimorfismo con Interfaces
IVehiculo miVehiculo; miVehiculo = new Coche(); miVehiculo.Conducir(); // Salida: Conduciendo un coche miVehiculo = new Bicicleta(); miVehiculo.Conducir(); // Salida: Conduciendo una bicicleta
Clases Abstractas y Polimorfismo
Las clases abstractas pueden contener métodos abstractos que deben ser implementados por las clases derivadas. Esto también permite el polimorfismo.
Ejemplo de Clases Abstractas
public abstract class Forma { public abstract void Dibujar(); } public class Circulo : Forma { public override void Dibujar() { Console.WriteLine("Dibujando un círculo"); } } public class Cuadrado : Forma { public override void Dibujar() { Console.WriteLine("Dibujando un cuadrado"); } }
Uso de Polimorfismo con Clases Abstractas
Forma miForma; miForma = new Circulo(); miForma.Dibujar(); // Salida: Dibujando un círculo miForma = new Cuadrado(); miForma.Dibujar(); // Salida: Dibujando un cuadrado
Ejercicio Práctico
Ejercicio
- Crea una clase base llamada
Empleado
con un método virtualCalcularSalario
. - Crea dos clases derivadas,
EmpleadoTiempoCompleto
yEmpleadoMedioTiempo
, que sobrescriban el métodoCalcularSalario
. - En la clase
EmpleadoTiempoCompleto
, el salario se calcula comohorasTrabajadas * tarifaPorHora
. - En la clase
EmpleadoMedioTiempo
, el salario se calcula comohorasTrabajadas * tarifaPorHora * 0.5
. - Crea una lista de
Empleado
y añade instancias deEmpleadoTiempoCompleto
yEmpleadoMedioTiempo
. - Itera sobre la lista y llama al método
CalcularSalario
para cada empleado.
Solución
public abstract class Empleado { public string Nombre { get; set; } public int HorasTrabajadas { get; set; } public double TarifaPorHora { get; set; } public abstract double CalcularSalario(); } public class EmpleadoTiempoCompleto : Empleado { public override double CalcularSalario() { return HorasTrabajadas * TarifaPorHora; } } public class EmpleadoMedioTiempo : Empleado { public override double CalcularSalario() { return HorasTrabajadas * TarifaPorHora * 0.5; } } public class Program { public static void Main() { List<Empleado> empleados = new List<Empleado> { new EmpleadoTiempoCompleto { Nombre = "Juan", HorasTrabajadas = 40, TarifaPorHora = 20 }, new EmpleadoMedioTiempo { Nombre = "Ana", HorasTrabajadas = 20, TarifaPorHora = 15 } }; foreach (var empleado in empleados) { Console.WriteLine($"Salario de {empleado.Nombre}: {empleado.CalcularSalario()}"); } } }
Salida Esperada
Conclusión
El polimorfismo es una característica poderosa de la Programación Orientada a Objetos que permite que una entidad tome múltiples formas. En C#, se puede lograr mediante la sobrecarga de métodos, la sobrescritura de métodos, el uso de interfaces y clases abstractas. Comprender y utilizar el polimorfismo te permitirá escribir código más flexible y extensible.
Curso de Programación en C#
Módulo 1: Introducción a C#
- Introducción a C#
- Configuración del Entorno de Desarrollo
- Programa Hola Mundo
- Sintaxis y Estructura Básica
- Variables y Tipos de Datos
Módulo 2: Estructuras de Control
Módulo 3: Programación Orientada a Objetos
- Clases y Objetos
- Métodos
- Constructores y Destructores
- Herencia
- Polimorfismo
- Encapsulamiento
- Abstracción
Módulo 4: Conceptos Avanzados de C#
- Interfaces
- Delegados y Eventos
- Genéricos
- Colecciones
- LINQ (Consulta Integrada en el Lenguaje)
- Programación Asíncrona
Módulo 5: Trabajando con Datos
Módulo 6: Temas Avanzados
- Reflexión
- Atributos
- Programación Dinámica
- Gestión de Memoria y Recolección de Basura
- Multihilo y Programación Paralela
Módulo 7: Construcción de Aplicaciones
Módulo 8: Mejores Prácticas y Patrones de Diseño
- Estándares de Codificación y Mejores Prácticas
- Patrones de Diseño
- Pruebas Unitarias
- Revisión y Refactorización de Código