Una de las características mas destacadas de los lenguajes de programación orientada a objetos es su capacidad de reutilizar el código a traves del concepto de herencia.Usando la herencia una clase (hija) puede heredar todas las características de una clase padre.
Esta característica tan comentada por todos es muchas veces mal interpretada a la hora de ponernos a desarrollar .Vamos a ver un ejemplo sencillo.
Aqui hemos construido una jerarquia de clases elemental . Tenemos a nuestra disposición la clase Motor y la clase Coche que es su clase hija. Por lo tanto la clase Coche hereda las propiedades de potencia y cilindros que el motor tiene. Todo parece correcto en un primer momento ya que el coche hereda la potencia y los cilindros.Ahora bien imaginemonos que añadimos un par de de propiedades más( peso y precio).
En un principio podemos pensar que son propiedades similares a las anteriores .Sin embargo el motor tiene un peso y el coche tiene otro peso completamente distinto y lo mismo sucede con el precio una cosa es el precio del coche y otra el precio de un motor. Por lo tanto es mas que probable que un diseño tuviera que tener en cuenta esto reflejandolo en el diagrama de la siguiente forma.
Es un pequeño problema aunque puede ser asumible .Sin embargo en cuanto comencemos a implementar métodos la situación empeorará una cosa es arrancar el motor y otra cosa es arrancar el coche con toda su electronica. Ni que decir tiene que no se parecerá nada el método de parar motor al de parar el coche . Es evidente que nuestro diseño tiene un problema importante.Ahora bien si echamos echamos un vistazo al siguiente diagrama de herencia.
Nos daremos cuenta que si añadimos la propiedad nombre a la clase Persona la clase Deportista lo heredará de una forma natural .Ocurrirá lo mismo con un método como andar o con propiedades como el peso . Esta Jerarquia de clases es mucho mas sólida . No siempre la herencia es la mejor solución para todos nuestros problemas a la hora de reutilizar el código . En el proximo post veremos como usar la herencia y como distinguir situaciones optimas de situaciones problematicas y como solventar estas.
Saludos:
Realmente hay que entender la herencia desde el punto de vista conceptual como una relación entre clases del tipo ES UN. En realidad un coche NO ES UN motor.
Desde el punto de vista matemático más riguroso que nos permite eliminar cualquier duda de si la relación de herencia es correcta, es verificar si los elementos u objetos de la clase hija H pertenecen todos a la clase padre P, es decir, se debe verificar que H sea subcojunto de P
Los coches NO SON UN SUBCOJUNTO de los motores.
Gracias por el aporte 🙂
Buen ejemplo. De hecho la solución sería tener una clase Coche que contiene un objeto de tipo Motor con todas sus propiedades. La clase coche puede contener otros objetos como transmisión , llantas, etc.
Pero heredaría de una clase genérica llamada Vehículo.
gracias 🙂
Saludos. Podría hablar sobre mas conceptos de orientación a objetos? Me interesa sobre todo el uso de las interfaces, es que no termino de comprender ese “compromiso” de implementar ciertas funciones. Y la importancia de la herencia en la reutilizacion de metodos.
Lo dare una vuelta a ver si se me ocurre algun articulo mas clarificador recuerdamelo en usas semanas 🙂
Muy buenos aportes, gracias Cecilio
Es verdad que la herencia, es algo poderoso, pero la verdad siguiendo los principios SOLID, y teniendo en cuenta el concepto de “es un”( en el cual el ejemplo de motor y coche directamente estaria mal planteada la herencia ) no tendria que haber problema. COn varios colegas creemos que la herencia por compilador tendria qeu: Estar limitada a dos niveles.. o mejor no insistir, y directamente sacarla!! haha!. Lo mejor que un desarrollador puede hacer , desde mi opinion es directamente pensar en interfaces. Composición sobre herencia, y se consigue un codigo reutilizable y testeable. En fin.. leer a… Read more »
Bueno al final hay mas historias que ire contando.. el concepto “es un ” no siempre es tan bueno como parece … aunque en un 95 % de los casos funciona bien. A ver si tengo un hueco y decido un articulo a explicar a fondo la regla de liskov:)