Polimorfismo
El polimorfismo es un concepto fundamental en la programación orientada a objetos. Se refiere a la capacidad de tratar objetos de diferentes clases de manera uniforme, permitiendo que un método se comporte de manera diferente según el tipo de objeto en tiempo de ejecución. Hay dos aspectos clave del polimorfismo:
- Polimorfismo de tiempo de ejecución:
- En este caso, los objetos de una clase derivada pueden ser tratados como objetos de una clase base.
- El tipo declarado del objeto ya no es idéntico a su tipo en tiempo de ejecución.
- Ejemplo: Supongamos que tenemos una jerarquía de formas (círculos, rectángulos, triángulos). En tiempo de compilación, no sabemos qué tipo de forma creará el usuario, pero en tiempo de ejecución, podemos tratar todas las formas como objetos de la clase base “Forma”.
- Métodos virtuales y anulación:
- Las clases base pueden definir e implementar métodos virtuales.
- Las clases derivadas pueden invalidar (sobrescribir) estos métodos virtuales con su propia implementación.
- Ejemplo: Consideremos una clase base “Forma” con un método virtual “Dibujar”. Las clases derivadas (como “Círculo”, “Rectángulo” y “Triángulo”) pueden proporcionar su propia implementación para el método “Dibujar”.
Aquí tienes un ejemplo práctico en C#:
public class Forma
{
public virtual void Dibujar()
{
Console.WriteLine("Dibujando una forma genérica.");
}
}
public class Circulo : Forma
{
public override void Dibujar()
{
Console.WriteLine("Dibujando un círculo.");
}
}
public class Rectangulo : Forma
{
public override void Dibujar()
{
Console.WriteLine("Dibujando un rectángulo.");
}
}
// Uso
static void Main()
{
List<Forma> formas = new List<Forma>
{
new Circulo(),
new Rectangulo()
};
foreach (var forma in formas)
{
forma.Dibujar(); // Polimorfismo en acción
}
}
En este ejemplo, el método Dibujar
se comporta de manera diferente según el tipo de forma (círculo o rectángulo) en tiempo de ejecución. El polimorfismo nos permite trabajar con grupos de objetos relacionados de manera uniforme.
Un ejemplo
class Persona { private string _nombre; public Persona(string nombre) { Console.WriteLine("Constructor persona " + nombre); this.Nombre = nombre; } public string Nombre { set { this._nombre = value; } get { return this._nombre; } } public virtual string saludo() { return "Hola "+Nombre+" que tal"; } } class Empleado :Persona { public Empleado(string nombre) : base(nombre) { Console.WriteLine("Constructor empleado " + nombre); this.Cargo = "Empleado"; } private string _cargo; public string Cargo { set { this._cargo = value; } get { return this._cargo; } } public override string saludo() { return "Hola empleado " + Nombre + " ¿Todo bien?"; } } class Gerente : Empleado { public int Bono { get; set; } public Gerente(string nombre) : base(nombre) { Console.WriteLine("Constructor gerente " + nombre); this.Cargo = "Gerente"; } public Gerente(string nombre, int bono) : this(nombre) { this.Bono = bono; } public override string saludo() { return "Hola Sr. " + Nombre + " ¿Desea alguna cosa?"; } } sealed class Direccion : Gerente { public Direccion(string nombre) : base(nombre, 100) { Console.WriteLine("Constructor direccion " + nombre); } public override string saludo() { return "Buenos días Sr. " + Nombre + " Estamos a sus órdenes"; } }
Ejemplo de uso:
Persona[] plantilla = { new Persona("Eva"), new Empleado("Juan"),new Empleado("Ana"), new Gerente("Rosa"), new Gerente("Luis"), new Direccion("Laura")}; foreach(Persona empleado in plantilla) { Console.WriteLine(empleado.saludo()); }