C# día 10: herencia
En un solo ejemplo de código vamos a ver como crear herencia de una clase a otra, en este caso de la clase Dispositivo a la clase Movil. Aquí entrará en juego el polimorfismo, es decir, un mismo método en la clase hija y clase padre con distinto efecto.
Merece la pena comentar que disponemos de clases abstractas y también de clases que NO se puede heredar (sealed).
Vamos a ver:
/** * Dispositivo.cs * Superclase o clase padre para definir los dispositivos, * de esta heredarán dispositivos más concretos como Ordenador, Móvil,.. */ using System; public class Dispositivo { // Atributos, algunos con sus accesos set y get protected string nombre; // Protected: solo accesible para clases hijas private int anchura; // Private: inaccesible para cualquier otra clase // Atributo con metodos set/get protected int altura { get { return altura; } set { altura = value; } } double peso; int voltaje { get { return voltaje; } set { voltaje = value; } } // Constructor sin parámetros public Dispositivo () { nombre = "Dispositivo"; anchura = 40; altura = 50; peso = 1.5; voltaje = 12; System.Console.WriteLine("Dispositivo creado {0}", nombre); } // Constructor parametrizado public Dispositivo (string nombre, int voltaje) { this.nombre = nombre; anchura = 40; altura = 50; peso = 1.5; this.voltaje = voltaje; } // Método destuctor ~Dispositivo() { System.Console.WriteLine("Dispositivo eliminado {0}", nombre); } // Muestra todo Por pantalla public void muestra() { System.Console.WriteLine("Nombre: {0}", nombre); System.Console.WriteLine("Anchura: {0}", anchura); System.Console.WriteLine("Altura: {0}", altura); System.Console.WriteLine("Peso: {0}", peso); System.Console.WriteLine("Voltaje: {0}", voltaje); } // Método VIRTUAL. Lo sobreescribimos en el hijo // Enciende el dispositivo public virtual void encender() { System.Console.WriteLine("Dispositivo {0} encendido", nombre); } // Método ABSTRACT. No se puede invocar el del padre, // pero si el que implementa el hijo. Para usarlo la // clase también debe ser abstracta: public abstract class Dispositivo // apagar. Apaga el dispositivo /*public abstract void apagar() { System.Console.WriteLine("Dispositivo {0} apagado", nombre); }*/ } // Clase Movil, que hereda de la clase dispositivo // por lo que se hace con sus atributos y métodos public class Movil : Dispositivo { // Metemos un atributo propio string marca; // Constructor, que invoca a la base public Movil() : base() { System.Console.WriteLine("Móvil creado {0}", nombre); } // Constructor, que invoca a la base public Movil(string nombre, int voltaje) : base(nombre, voltaje) { System.Console.WriteLine("Móvil creado {0}", nombre); } // Constructor, que invoca a la base en parte public Movil(string marca, string nombre, int voltaje) : base(nombre, voltaje) { this.marca = marca; System.Console.WriteLine("Móvil creado {0}", nombre); } // Llamada POLIMÓRFICA. Invoca el mismo método pero hace algo distinto // Hay que poner la palabra new para indicarlo!!! // toString : Muestra todo Por pantalla public new void muestra() { // Que haga lo mismo que la superclase... base.muestra(); // .. y además System.Console.WriteLine("Marca: {0}", marca); } // Método VIRTUAL. Para asegurarnos que al invocar "encender" // se llama al hijo y no al padre debemos meter la palabra override public override void encender () { System.Console.WriteLine("Movil {0} encendido", marca); } // Metodo principal public static void Main () { Movil tiemensA35i = new Movil(); Movil noki45210 = new Movil("Noki45210", 12); Movil amotorola = new Movil("Amotorola", 9); Dispositivo generico = new Dispositivo(); tiemensA35i.muestra(); noki45210.muestra(); System.Console.WriteLine("Tipo generico {0}", generico.GetType()); // OPERADOR IS: sirve para comprobar el tipo de una clase if (noki45210 is Movil) { // Efectivamente, es un movil System.Console.WriteLine("Tipo noki {0}", noki45210.GetType()); } System.Console.WriteLine("Altura Nokia: {0}", noki45210.altura); // Encendemos el movil amotorola.encender(); // Encendemos el dispositivo generico.encender(); // Sacamos sus datos... amotorola.ToString(); } } // SEALED: una clase de la que nadie puede heredar // Clase Marca public sealed class Marca { public static string[] marca = new string[3]{"TIEMENS","BENG","LGE"}; }