"¡Hola, amigo! Finalmente hemos llegado a algo realmente interesante. Hoy les hablaré sobre la herencia múltiple . La herencia múltiple es una herramienta realmente fascinante y poderosa. Y si no fuera por varios problemas, entonces Java admitiría la herencia múltiple de clases. Pero no es así, por lo que debemos contentarnos con la herencia múltiple de interfaces . Lo cual también es bastante asombroso".

Heredar múltiples interfaces - 1

Imagina que estás escribiendo un juego de computadora. Y sus personajes (sus objetos) deben comportarse de maneras muy complejas: caminar por un mapa, recolectar elementos, realizar misiones, comunicarse con otros personajes, matar a alguien, salvar a alguien más. Digamos que has podido dividir todos los objetos en 20 categorías. Esto significa que, si tiene suerte, podrá arreglárselas con solo 20 clases para definir sus objetos. Pero aquí está el problema: ¿cuántas formas únicas de interacción tendrán estos objetos? Cada tipo de objeto puede tener interacciones únicas con otros 20 tipos de objetos (también contamos las interacciones con objetos del mismo tipo). En otras palabras, deberá escribir código para 20 x 20 = 400 interacciones. Y si la cantidad de tipos de objetos únicos no es 20, sino 100, ¡entonces la cantidad de interacciones podría ser 10,000!

"¡Vaya! Ahora entiendo por qué programar es un trabajo tan difícil".

"Es simple. Gracias a un montón de abstracciones. Y con no poco gracias a la herencia múltiple de interfaces".

A menudo podemos simplificar la interacción de objetos si los roles y/o habilidades interactúan en lugar de los objetos mismos. Y como ya sabemos, las habilidades se pueden agregar fácilmente a una clase cuando implementa alguna interfaz.

Al escribir un programa grande, los desarrolladores suelen hacer esto desde el principio:

1) Identificar todas las habilidades/roles.

2) Definir la interacción entre estos roles.

3) Luego simplemente asigne roles a todas las clases.

"¿Tal vez un ejemplo?"

"Por supuesto. Veamos los roles en la caricatura "Tom y Jerry"."

codigo Java Descripción
interface Moveable
{}
— Rol/capacidad de moverse.
interface Eatable
{}
— Rol/capacidad para ser comido.
interface Eat
{}
— Rol/capacidad de comerse a alguien.
class Tom extends Cat implements Moveable, Eatable, Eat
{}
Tom es un gato que tiene tres roles:
1) Puede moverse
2) Puede comerse a alguien
3) Puede ser comido por alguien (un perro)
class Jerry extends Mouse implements Moveable, Eatable
{}
Jerry es un ratón que tiene dos roles:
1) Puede moverse
2) Alguien puede comérselo
class Killer extends Dog implements Moveable, Eat
{}
Killer es un perro con dos roles: 1) Puede moverse 2) Puede comerse a alguien

Conociendo solo estos tres roles (interfaces), puede escribir un programa y describir la interacción correcta entre estos roles. Por ejemplo, un objeto perseguirá (a través de la interfaz movible) al «uno que puedes comer» y huirá del «alguien que puede comerte». Y todo ello sin saber de objetos específicos. Si agrega más objetos (clases) al programa y mantiene estos roles, seguirá funcionando maravillosamente, controlando el comportamiento de sus objetos.