DEV Community

Cover image for Herencia múltiple en Java? No, interfaces(Explicado con Cerveza)
Nahuel Segovia
Nahuel Segovia

Posted on

Herencia múltiple en Java? No, interfaces(Explicado con Cerveza)

Uno de los problemas o mejor dicho soluciones que implementó Java para persistir de la herencia múltiple fueron las interfaces. Pero expliquemos, ¿Por qué lo hicieron? Bueno, primero algo de WikiBlogging:

  • Herencia múltiple: capacidad para heredar métodos de dos o más clases.

Bien ya sabemos que podemos heredar métodos múltiples por lo que vamos a fabricar nuestro propio vaso robótico que sirve contenido solo y que se llama VasoComun, y por una simple razón queremos que en este vaso tenga la capacidad de servir cerveza y servir agua, así que heradamos los metodos de VasoDeAgua y VasoDeCerveza. Venimos de un largo día de trabajo y queremos tomar cerveza y escuchar un poco de música, entonces procedemos a servir en nuestro vaso:

vasoComun.servir();

ESPERÁ, como VasoComun hereda los métodos de VasoDeCerveza y VasoDeAgua, los dos tienen la funcionalidad para poder servirnos, pero VasoDeaAgua.servir(); nos sirve agua y VasoDeCerveza.servir(); nos sirve cerveza.

Exacto, ese es uno de los problemas con la herencia múltiple, de este modo nuestro vaso robótico no va a saber a cuál método recurrir para poder servirnos el contenido, ya que las dos clases tienen el mismo método con el mismo nombre.

A esto se lo conoce como problema del diamante, y paso a mostrarlo en una explicación gráfica(graphic design is my passion):

Alt Text

¿Como resuelve esto Java? Gracias a la creación de las interfaces:

Una interfaz en Java es una colección de métodos abstractos y propiedades constantes.

En las interfaces se especifica qué se debe hacer pero no su implementación. Serán las clases que implementen estas interfaces las que describen la lógica del comportamiento de los métodos.

Si nosotros creamos una interface para cada vaso

public interface VasoCerveza {
    public String servir(String bebida);
}
Enter fullscreen mode Exit fullscreen mode
public interface VasoAgua {
    public String servir(String bebida);
}
Enter fullscreen mode Exit fullscreen mode

Al momento de elegir que tipo de contenido queremos en nuestro vaso, podemos elegir si queremos que nos sirva cerveza o agua:

package proyecto.vaso;

public class VasoComun implements VasoCerveza, VasoAgua {
        @Override
    public String servir(bebida){
           return "Te acabo de servir" + bebida;
        }


}   
Enter fullscreen mode Exit fullscreen mode

De esta forma estaremos reescribiendo el método servir() así que si queremos tomar cerveza vasoComun.servir(cerveza) y ya podemos tomar cerveza, pero si queremos tomar cualquier otra cosa también podemos vasoComun.servir(jugo)

Por si tienen preguntas sobre @Override:

La anotación @Override simplemente se utiliza, para forzar al compilador a comprobar en tiempo de compilación que estás sobrescribiendo correctamente un método, y de este modo evitar errores en tiempo de ejecución, los cuales serían mucho más difíciles de detectar.

Espero que ayude :P

Discussion (0)