Para los nuevo en el mundo de la programación orientada a objetos este termino les ha de parecer familiar sin embargo no siempre lo tenemos muy claro y aun que comprendemos la herencia no sabemos realmente como utilizarla y cuales son las ventajas que implica.
La herencia es la propiedad que tienen todas las clases u objetos para compartir las propiedades o comportamiento de la clase a la cual extienden. Cuando hablo de comportamiento me refiero a que tiene los mismos métodos, propiedades y que tiene un mismo ancestro en común.
Para explicar mejor un ejemplo analizaremos la siguiente imagen:
Podemos apreciar una estructura que representa a los animales desde lo mas genérico como es Animal hasta lo mas especifico como la Raza exacta de una especie determinada.
De esta imagen podemos podemos distinguir los niveles de Herencia en rojo, si nos damos cuenta cualquier raza o especie tiene como padre común a Animal lo que nos dice que todos son animales.
A si mismo cualquier raza de pero como Pastor Alemán, Dálmata o cualquier raza podríamos decir que es un Perro ya que tiene como padre a Perro, pero también podríamos decir que es un Animal por que tiene como máximo ancestro a Animal y a sí sucesivamente para cada raza.
Si esto lo quisiéramos convertir a Clases lo mas seguro es que te imagines que cada Nodo(En verde) seria una clase la cual extendería a la clase que tiene justo Arriba por ejemplo Pastor Alemán extiende de Perro y Perro extiende de Animal. Bien esta solución seria valida pero no seria optima por la gran cantidad de clases que se requerirían para hacer la estructura de todos los animales que existen. Para solucionar esto tendríamos que analizar la estructura y ver de que forma podemos hacer menos compleja la estructura de tal forma que cumpla con todas las características que tiene una raza, especie y animal.
Empezaremos analizando la estructura desde lo mas básico que es el Máximo ancestro el cual es Animal:
Bien un animal tiene como propiedades(Variables) un nombre, pertenece a una especie, tiene una edad y como operaciones(Métodos) tendría comunicarse(Ladrar,Trinan, Maúllar) de una forma abstracta.
Con esto podríamos crear una clase Abstracta que represente el comportamiento de un Animal de la forma mas primitiva(Con las operaciones y propiedades mínimas que tiene un animal y que son común para TODAS) y quedaría de la siguiente manera:
Continuemos con las especie o el segundo nivel de nuestro primero dibujo, Para definir las especies tendríamos que crear una clase para cada especia de tal forma que solo cuente con las propiedades especificas que comparten todos los animales de la misma especie.
Como ejemplo pongo la clase Perro y Ave las cuales tiene propiedades y operaciones únicas de la especie y que no comparten con otras.
Si nos damos cuenta Ave tiene la operación hacerNido ya que las aves hacen un nido cuando quieren poner sus huevos, sin embargo un perro no tiene esta operación por que no hace nidos. También si nos damos cuenta implementa el método comunicarse para hacer como un Ave y tiene alas como propiedades.
Por otro lado tenemos al perro que implementa la operación comunicarse pero en vez de hacer como Ave este ladra, también vemos que tiene patas, cola y número de registro. Por otro lado tiene la operación olfatear que solo los perros tiene y las aves no.
Por ultimo faltaría el tercer nivel de herencia pero si nos damos cuenta la clase Animal ya tiene la propiedad raza por lo que cuando creemos una clase Perro o Ave ya tendremos la propiedad para establecer la raza.
Diseñando nuestras clases tendríamos como resultado esta estructura de clases.
Como código de ejemplo podríamos tener un perro Dálmata el siguiente:
Perro dalmata = new Perro();
daltma.setNombre(“Juan Perez”);
daltma.setRaza(“Dálmata”);
daltma.setEdad(2);
dalmata.setNumeroRegitro(12123123);
daltama.olfatear();
daltama.comunicarse();
Con este código estamos estableciendo las propiedades de un perro y podríamos utilizar las operaciones propias de un Perro pero sigue siendo un Animal.
Esto también seria valido:
Animal dalmata = new Perro();
dalmata.comunicarse();
Bien, Espero que con este pequeño ejemplo se pueda entender mejor lo que es la Herencia en el paradigma orientado a objetos(POO).