Um outro problema da herança múltipla é o efeito diamante que, se não for bem pensado, pode gerar um pepino bem grande pro desenvolvedor. Imaginemos que Java possua herança múltipla, e que tivéssemos as classes Tranporte e Ativo estendendo diretamente Object. Então, estenderiamos tanto Transporte e Ativo para a criação da classe Yate, porém sem o método equals.
Bom, chega um certo momento que uma referência Object possua uma instancia Yate, assim:
Object obj = yate;
Aí, numa outra parte do código, quero chamar equals()
obj.equals(anotherObj);
Pergunta: o que que o interpretador java irá fazer? Não pode chamar equals de Yate, pq não tem. Tanto Transporte quanto Ativo possuem o mesmo nível de hierarquia, e não daria pra chamar um antes do outro ou escolher um deles pois não existe nada codificado dizendo isso. E não dá pra seguir tipo uma “convenção sobre configuração” dizendo que a primeira classe após a palavra extends é a que vale, porque geraria muita confusão pros novatos que veriam um programa não-responsivo.
Bom, poderíamos criar o método equals na classe Yate, então! Mas se precisarmos chamar o super, quem seria a referência? O C++ tem o operador de escopo (: onde basta escolher qual superclasse se quer utilizar, mas isso só acontece porque C++ possui um modelo de gerenciamento memória bastante diferente do Java, o qual dá pra fazer isso. Em Java, nem pensar.
Uma outra situação, e se Transporte e Ativo não estendessem Object, mas ObjectPlus, cuja implementação é essa?
public class ObjectPlus {
int quantidade;
public int getQuantidade() {
return quantidade;
}
public void setQuantidade(int quantidade) {
this.quantidade = quantidade;
}
}
Imagine: Transporte tem a sua variável quantidade, Ativo também, e Yate? Sendo herdeiro de duas classes, não teria duas variáveis “quantidade”? E quando eu chamo:
ObjectPlus objPlus = yate;
objPlus.setQuantidade(3);
De que implementação eu estou considerando? Transporte ou Ativo?
Por essas coisas, é que é bem melhor usar herança simples, não dá tanta dor de cabeça. Até mesmo quando eu programava em C++, só usava herança simples. Na única vez que tentei, deu um monte de pau, e como as mensagens de erro não são lá muito claras, resolvi nem seguir adiante.