Herencia Múltiple en Java, ¿Conveniente o no?

23 marzo 2009

Todos sabemos que la herencia es un mecanismo propio de la programación orientada a objetos POO. Nos permite crear clases a partir de otra, las cuales las unen vínculos sumamente estrechos, casi de familia. Es por ello que se llama herencia.

Si buscamos modelar nuestras clases u objetos como propios de la realidad, todos los conceptos de la orientación a objetos nos serán muy fácil de implementar mientras programamos.

Implementando herencia tenemos las siguientes ventajas:

  • Modelado de la realidad
  • Evitar redundancias en el código
  • Facilita la reutilización del código, así como reduce el número de líneas a escribir
  • Sirve como el soporte o la base para el polimorfismo
Es muy sencilo implementar la herencia de clases en Java. Basándonos en el diagrama de arriba, si queremos crear la clase gallina solo debemos de interponer la palabra reservada extends. Por lo tanto la declaración de la clase quedaría constituida de la siguiente manera:

public class Gallina extends Ave{
}

Ahora podemos tener dentro de gallina, todos los atributos y métodos propios de una Ave.

Esta forma de herencia es llamada herencia simple, ya que solamente hay una clase padre o superclase. Existe una forma de herencia definida dentro de los conceptos de la programación orientada a objetos en la cual una clase puede heredar de dos o más clases padres o superclases. Se llama Herencia Múltiple.

La herencia múltiple en java no es soportada nativamente. Sin embargo muchos autores y desarrolladores la simulan utilizando la palabra reservada implements e interfaces, que sirve para implementar o cubrir una clase con respecto a otra.

Supongamos el siguiente escenario:


Un alumno de la cátedra de Programación II además que es una persona consagrada, también es un hijo de familia que debe responder con buenas notas en su travesía por la universidad. Es decir que una clase alumno debería de heredar de ambos objetos. Hacer este pequeño diagrama UML en código Java no se puede nativamente hablando, solamente con una simulación. La manera de realizarla es la siguiente:

public class Persona {

}


public class Hijo{
}
interface iHijo{
//La interface pertenece a la clase Hijo
}


public class Alumno extends Persona implements iHijo{
}

Con la ayuda de las interfaces simulamos la herencia múltiple. Una interface no es más que la implementación de los métodos de una clase. Con la ayuda de éstos podemos accesar a los métodos de la clase Hijo y heredar directamente todo lo que pertenece a Persona. Fácil, pero a la vez confuso, ¿No?

Conclusión: ¿Se debe utilizar la herencia múltiple? A mi forma de pensar, si no está implementada nativamente, se debería de evitar el uso de una simulación que va en contra de la naturaleza del lenguaje. Además pienso que todo problema que o esquema de clases se pueden llegar a plantear de forma que solamente utilicemos la herencia simple, ya que es más sencilla y es más natural que se herede de un solo padre.

Como ejercicio al lector, le pido que plantee el esquema de clases para el ejemplo utilizado en la simulación de la herencia múltiple. ¿Cómo lo plantearía con herencia simple?