C# Polimorfismo
Polimorfismo y métodos primordiales
Polimorfismo significa "muchas formas" y ocurre cuando tenemos muchas clases que están relacionadas entre sí por herencia.
Como especificamos en el capítulo anterior Herencia nos permite heredar campos y métodos de otra clase. El polimorfismo utiliza esos métodos para realizar diferentes tareas. Esto nos permite realizar una misma acción de diferentes maneras.
Por ejemplo, piense en una clase base llamada Animal
que tiene un método llamado animalSound()
. Las clases derivadas de animales podrían ser cerdos, gatos, perros, pájaros, y también tienen su propia implementación de un sonido animal (el cerdo gruñe y el gato maúlla, etc.):
Ejemplo
class Animal // Clase base (padre)
{
public void animalSound()
{
Console.WriteLine("El animal hace un sonido");
}
}
class Pig : Animal // Clase derivada (niño)
{
public void animalSound()
{
Console.WriteLine("El cerdo dice: pipi");
}
}
class Dog : Animal // Clase derivada (niño)
{
public void animalSound()
{
Console.WriteLine("El perro dice: guau guau");
}
}
Recuerda del capítulo de C# Herencia que usamos el símbolo :
para heredar de una clase.
Ahora podemos crear objetos Pig
y Dog
y llamar al animalSound()
método en ambos:
Ejemplo
class Animal // Clase base (padre)
{
public void animalSound()
{
Console.WriteLine("El animal hace un sonido");
}
}
class Pig : Animal // Clase derivada (niño)
{
public void animalSound()
{
Console.WriteLine("El cerdo dice: pipi");
}
}
class Dog : Animal // Clase derivada (niño)
{
public void animalSound()
{
Console.WriteLine("El perro dice: guau guau");
}
}
class Program
{
static void Main(string[] args)
{
Animal myAnimal = new Animal(); // Crear un objeto Animal
Animal myPig = new Pig(); // Crear un objeto Pig
Animal myDog = new Dog(); // Crear un objeto Dog
myAnimal.animalSound();
myPig.animalSound();
myDog.animalSound();
}
}
La salida será:
El animal hace un sonido
El animal hace un sonido
El animal hace un sonido
No es el resultado que estaba buscando
El resultado del ejemplo anterior probablemente no fue el que esperaba. Esto se debe a que el método de la clase base anula el método de la clase derivada cuando comparten el mismo nombre.
Sin embargo, C# proporciona una opción para anular el método de la clase base, agregando la palabra clave virtual
al método dentro de la clase base y usando la palabra clave override
palabra clave para cada método de clase derivada:
Ejemplo
class Animal // Clase base (padre)
{
public virtual void animalSound()
{
Console.WriteLine("El animal hace un sonido");
}
}
class Pig : Animal // Clase derivada (niño)
{
public override void animalSound()
{
Console.WriteLine("El cerdo dice: pipi");
}
}
class Dog : Animal // Clase derivada (niño)
{
public override void animalSound()
{
Console.WriteLine("El perro dice: guau guau");
}
}
class Program
{
static void Main(string[] args)
{
Animal myAnimal = new Animal(); // Crear un objeto Animal
Animal myPig = new Pig(); // Crear un objeto Pig
Animal myDog = new Dog(); // Crear un objeto Dog
myAnimal.animalSound();
myPig.animalSound();
myDog.animalSound();
}
}
La salida será:
El animal hace un sonido
El cerdo dice: pipi
El perro dice: guau guau
¿Por qué y cuándo utilizar "herencia" y "polimorfismo"?
Es útil para la reutilización del código: reutiliza campos y métodos de una clase existente cuando creas una nueva clase.