DEV Community

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

Posted on

4

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

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay