6.4. La herencia
Curso: Programación en C# (2015), por Nacho Cabanes
6.4. La herencia
Vamos a ver ahora cómo definir una nueva clase de objetos a partir de otra ya existente. Por ejemplo, vamos a crear una clase "Porton" a partir de la clase "Puerta". Un portón tendrá las mismas características que una puerta (ancho, alto, color, abierto o no), pero además se podrá bloquear, lo que supondrá un nuevo atributo y nuevos métodos para bloquear y desbloquear:
// Porton.cs // Clase que hereda de Puerta // Introducción a C#, por Nacho Cabanes using System; public class Porton : Puerta { bool bloqueada; public void Bloquear() { bloqueada = true; } public void Desbloquear() { bloqueada = false; } }
Con "public class Porton: Puerta" indicamos que Porton debe "heredar" todo lo que ya habíamos definido para Puerta. Por eso, no hace falta indicar nuevamente que un Portón tendrá un cierto ancho, o un color, o que se puede abrir: todo eso lo tiene por ser un "descendiente" de Puerta.
En este ejemplo, la clase Puerta no cambiaría nada.
No tenemos por qué heredar todo tal y como era; también podemos "redefinir" algo que ya existía. Por ejemplo, nos puede interesar que "MostrarEstado" ahora nos diga también si la puerta está bloqueada. Para eso, basta con volverlo a declarar y añadir la palabra "new" para indicar al compilador de C# que sabemos que ya existe ese método y que sabemos seguro que lo queremos redefinir (si no incluimos la palabra "new", el compilador mostrará un "warning", pero dará el programa como válido; más adelante veremos que existe una alternativa a "new" y en qué momento será adecuado usar cada una de ellas.
public new void MostrarEstado() { Console.WriteLine("Portón."); Console.WriteLine("Bloqueada: {0}", bloqueada); }
Puedes observar que ese "MostrarEstado" no dice nada sobre el ancho ni el alto del portón. En el próximo apartado veremos cómo acceder a esos datos.
Un programa de prueba, que ampliase el anterior para incluir un "portón", podría ser:
// Ejemplo_06_04a.cs // Portón, que hereda de Puerta // Introducción a C#, por Nacho Cabanes using System; public class Ejemplo_06_04a { public static void Main() { Puerta p = new Puerta(); Console.WriteLine("Valores iniciales..."); p.MostrarEstado(); Console.WriteLine(); Console.WriteLine("Vamos a abrir..."); p.Abrir(); p.SetAncho(80); p.MostrarEstado(); Console.WriteLine(); Console.WriteLine("Ahora el portón..."); Porton p2 = new Porton(); p2.SetAncho(300); p2.Bloquear(); p2.MostrarEstado(); } }
Y su resultado sería:
Valores iniciales... Ancho: 0 Alto: 0 Color: 0 Abierta: False Vamos a abrir... Ancho: 80 Alto: 0 Color: 0 Abierta: True Ahora el portón... Portón. Bloqueada: True
Ejercicios propuestos:
Ejercicio propuesto 6.4.1: Crea un proyecto con las clases Puerta, Portón y Ejemplo_06_04a. Prueba que todo funciona correctamente.
Ejercicio propuesto 6.4.2: Crea una variante ampliada del ejercicio 6.3.2. En ella, la clase Persona no cambia. Se creará una nueva clase PersonaInglesa, en el fichero "personaInglesa.cs". Esta clase deberá heredar las características de la clase "Persona", y añadir un método "TomarTe", de tipo void, que escribirá en pantalla "Estoy tomando té". Crear también una clase llamada PruebaPersona2, en el fichero "pruebaPersona2.cs". Esta clase deberá contener sólo la función Main, que creará dos objetos de tipo Persona y uno de tipo PersonaInglesa, les asignará un nombre, les pedirá que saluden y pedirá a la persona inglesa que tome té.
Ejercicio propuesto 6.4.3: Amplía el proyecto del ejercicio 6.3.3 (Libro): crea una clase "Documento", de la que Libro heredará todos sus atributos y métodos. Ahora la clase Libro contendrá sólo un atributo "paginas", número entero, con sus correspondientes Get y Set.
Ejercicio propuesto 6.4.4: Amplía el esqueleto del ConsoleInvaders (ejercicio 6.3.6): Crea una clase "Sprite", de la que heredarán "Nave" y "Enemigo". La nueva clase contendrá todos los atributos y métodos que son comunes a las antiguas (todos los existentes, por ahora).
Ejercicio propuesto 6.4.5: Amplía el proyecto de la clase Coche (ejercicio 6.3.7): Crea una clase "Vehiculo", de la que heredarán "Coche" y una nueva clase "Moto". La clase Vehiculo contendrá todos los atributos y métodos que antes estaban en Coche, y tanto Coche como Moto heredarán de ella.
Actualizado el: 28-01-2015 14:30