Bienvenidos a este nuevo post en el que seguiremos hablando de los pilares fundamentales de la programación orientada a objetos, el polimorfismo.
Índex
1- Qué es el polimorfismo en programación orientada a objetos
Denominamos polimorfismo al mecanismo que nos permite tener un método en una clase padre como vimos en la herencia (link) y sobrescribirlo en la clase hija.
Esto quiere decir que tendremos el mismo método en ambas clases, pero en la clase hija realizara diferentes acciones. Por lo que el polimorfismo es también denominado sobreescritura de métodos.
Hay dos formas de polimorfismo
- En tiempo de ejecución, que tiene que ver con las interfaces (post disponible en unas semanas)
- La segunda llamada polimorfismo estático, la cual determina que método se va a ejecutar durante la compilación.
2 – Polimorfismo estático en C#
2.1 – Utilizando la palabra clave new
Para indicar que queremos sobrescribir un método debemos hacerlo utilizando la palabra reservada new
antes del nombre del método en la clase hijo. La cual nos crea una nueva versión del método, únicamente para esa clase.
Con ello lo que conseguimos es permitir que llamando “al mismo método” se realicen acciones diferentes.
class Vehiculo
{
public decimal VelocidadMaxima { get; set; }
public int NumeroRuedas { get; set; }
public string Marca { get; set; }
public string Modelo { get; set; }
public Vehiculo(string marca, string modelo)
{
Marca = marca;
Modelo = modelo;
}
public void Acelerar()
{
Console.WriteLine("Acelerar vehículo");
//Pisar el acelerador
}
}
class Moto : Vehiculo
{
public int Cilindrada { get; set; }
public Moto(string marca, string modelo, int cilindrada) : base(marca, modelo)
{
Cilindrada = cilindrada;
}
public new void Acelerar()
{
//Girar el puño
Console.WriteLine("Acelerar Moto");
}
}
Como podemos observar el método Acelerar
de la clase Moto
contiene la palabra reservada new
, ello causara que si llamamos a Moto.Acelerar()
se ejecutara el nuevo código, Mientras que si tenemos otra clase, como Vehiculo.Acelerar()
, o Coche.Acelerar()
si utilizamos los ejemplos del post anterior, se ejecutara el de la clase Vehiculo
, ya que Coche
no posee un método que sobrescriba al de la clase padre.
2.2- Utilizando las palabras clave virtual y override
En el mundo laboral, utilizar la forma con la palabra clave new
no es muy común, ya que da la sensación de que no se va a sobrescribir y puede llegar a ser muy confuso.
Para evitar esta sensación se puede indicar en el método padre que este va a ser sobrescrito utilizado la palabra clave virtual
public virtual void Acelerar()
{
Console.WriteLine("Acelerar vehículo");
//Pisar el acelerador
}
Y en el método de la clase hija, se indica con la palabra override que va a sobrescribir al método padre.
Es importante recordar que no podemos utilizar la palabra clave override
si el método padre no es virtual
.
public override void Acelerar()
{
//Girar el puño
Console.WriteLine("Acelerar Moto");
}
Aquí podemos ver el ejemplo completo:
class Vehiculo
{
public decimal VelocidadMaxima { get; set; }
public int NumeroRuedas { get; set; }
public string Marca { get; set; }
public string Modelo { get; set; }
public Vehiculo(string marca, string modelo)
{
Marca = marca;
Modelo = modelo;
}
public virtual void Acelerar()
{
Console.WriteLine("Acelerar vehículo");
//Pisar el acelerador
}
}
class Moto : Vehiculo
{
public int Cilindrada { get; set; }
public Moto(string marca, string modelo, int cilindrada) : base(marca, modelo)
{
Cilindrada = cilindrada;
}
public override void Acelerar()
{
//Girar el puño
Console.WriteLine("Acelerar Moto");
}
}