"Olá, amigo! Finalmente chegamos a algo realmente interessante. Hoje vou falar sobre herança múltipla . A herança múltipla é realmente uma ferramenta muito fascinante e poderosa. E se não fosse por vários problemas, então Java daria suporte à herança múltipla de classes. Mas não oferece, então devemos nos contentar com a herança múltipla de interfaces . O que também é incrível."

Herdando várias interfaces - 1

Imagine que você está escrevendo um jogo de computador. E seus personagens (seus objetos) devem se comportar de maneiras muito complexas: andar pelo mapa, coletar itens, realizar missões, comunicar-se com outros personagens, matar alguém, salvar alguém. Digamos que você conseguiu dividir todos os objetos em 20 categorias. Isso significa que, se você tiver sorte, poderá se virar com apenas 20 classes para definir seus objetos. Mas aqui está o problema: quantas formas únicas de interação esses objetos terão? Cada tipo de objeto pode ter interações únicas com 20 outros tipos de objetos (também estamos contando as interações com objetos do mesmo tipo). Em outras palavras, você precisará escrever código para 20 x 20 = 400 interações! E se o número de tipos de objetos exclusivos não for 20, mas 100, o número de interações poderá ser 10.000!

"Uau! Agora entendo porque programar é um trabalho tão difícil."

"É simples. Graças a muitas abstrações. E não menos graças à herança múltipla de interfaces."

Muitas vezes, podemos simplificar a interação do objeto se os papéis e/ou habilidades interagirem em vez dos próprios objetos. E como já sabemos, habilidades podem ser facilmente adicionadas a uma classe quando ela implementa alguma interface.

Ao escrever um programa grande, os desenvolvedores geralmente fazem isso desde o início:

1) Identifique todas as habilidades/funções.

2) Defina a interação entre esses papéis.

3) Em seguida, simplesmente atribua funções a todas as classes.

"Talvez um exemplo?"

"Claro. Vamos ver os papéis no desenho animado «Tom e Jerry»."

código Java Descrição
interface Moveable
{}
— Papel/capacidade de se mover.
interface Eatable
{}
— Papel/capacidade de ser comido.
interface Eat
{}
— Função/capacidade de comer alguém.
class Tom extends Cat implements Moveable, Eatable, Eat
{}
Tom é um gato que tem três funções:
1) Ele pode se mover
2) Ele pode comer alguém
3) Ele pode ser comido por alguém (um cachorro)
class Jerry extends Mouse implements Moveable, Eatable
{}
Jerry é um rato que tem duas funções:
1) Ele pode se mover
2) Ele pode ser comido por alguém
class Killer extends Dog implements Moveable, Eat
{}
Killer é um cachorro com duas funções: 1) Ele pode se mover 2) Ele pode comer alguém

Conhecendo apenas essas três funções (interfaces), você pode escrever um programa e descrever a interação correta entre essas funções. Por exemplo, um objeto irá perseguir (através da interface móvel) o «aquele que você pode comer» e fugir daquele «que pode comer você». E tudo isso sem saber sobre objetos específicos. Se você adicionar mais objetos (classes) ao programa e manter essas funções, ele ainda funcionará perfeitamente, controlando o comportamento de seus objetos.