6.7. Polimorfismo y sobrecarga
El concepto de "polimorfismo" se refiere a que una misma función (un método) puede tener varias formas, ya sea porque reciba distintos tipos de parámetros y/o en distinta cantidad, o porque incluso se aplique a distintos objetos.
Existen dos tipos especialmente importantes de polimorfismo:
- En nuestro último ejemplo, los dos constructores "Puerta()" y "Puerta(int ancho, int alto)", que se llaman igual pero reciben distintos parámetros, y se comportan de forma que puede ser distinta, son ejemplos de "sobrecarga" (también conocida como "polimorfismo ad-hoc"). Es un tipo de polimorfismo en el que el compilador sabe en tiempo de compilación a qué método se debe llamar.
- El caso opuesto es el "polimorfismo puro", en el que un mismo método se aplica a distintos objetos de una misma jerarquía (como el "MostrarEstado" que se puede aplicar a una puerta o a un portón), y en ese caso el compilador puede llegar a no ser capaz de saber en tiempo de compilación a qué método se debe llamar, y lo tiene que descubrir en tiempo de ejecución. Es algo que nos encontraremos un poco más adelante, cuando hablemos de "funciones virtuales".
6.8. Orden de llamada de los constructores
Cuando creamos objetos de una clase derivada, antes de llamar a su constructor se llama a los constructores de las clases base, empezando por la más general y terminando por la más específica. Por ejemplo, si creamos una clase "GatoSiamés", que deriva de una clase "Gato", que a su vez procede de una clase "Animal", el orden de ejecución de los constructores sería: Animal, Gato, GatoSiames, como se ve en este ejemplo:
/*---------------------------*/ /* Ejemplo en C# nº 62: */ /* ejemplo62.cs */ /* */ /* Cuarto ejemplo de clases */ /* Constructores y herencia */ /* */ /* Introduccion a C#, */ /* Nacho Cabanes */ /*---------------------------*/ using System; public class Animal { public Animal() { Console.WriteLine("Ha nacido un animal"); } } // ------------------ public class Perro: Animal { public Perro() { Console.WriteLine("Ha nacido un perro"); } } // ------------------ public class Gato: Animal { public Gato() { Console.WriteLine("Ha nacido un gato"); } } // ------------------ public class GatoSiames: Gato { public GatoSiames() { Console.WriteLine("Ha nacido un gato siamés"); } } // ------------------ public class Ejemplo62 { public static void Main() { Animal a1 = new Animal(); GatoSiames a2 = new GatoSiames(); Perro a3 = new Perro(); Gato a4 = new Gato(); } }
El resultado de este programa es:
Ha nacido un animal
Ha nacido un animal
Ha nacido un gato
Ha nacido un gato siamés
Ha nacido un animal
Ha nacido un perro
Ha nacido un animal
Ha nacido un gato
Ejercicio propuesto:
- Crear un único fuente que contenga las siguientes clases:
- Una clase Trabajador, cuyo constructor escriba en pantalla "Soy un trabajador".
- Una clase Programador, que derive de Trabajador, cuyo constructor escriba en pantalla "Soy programador".
- Una clase Analista, que derive de Trabajador, cuyo constructor escriba en pantalla "Soy analista".
- Una clase Ingeniero, que derive de Trabajador, cuyo constructor escriba en pantalla "Soy ingeniero".
- Una clase IngenieroInformatico, que derive de Ingeniero, cuyo constructor escriba en pantalla "Soy ingeniero informático".
- Una clase "PruebaDeTrabajadores", que cree un objeto perteneciente a cada una de esas clases.