Na minha opinião o uso de interfaces cobre a falta da herança múltipla.
Acredito que a implementação de herança múltipla poderia trazer mais caos do que benefícios. Acredito que foi uma idéia muito inteligente dos criadores da linguagem na não implentação deste item da orientação a objetos.
Portanto, sou a favor da não implementação da herança múltipla em Java.
Possuo uma classe Carro que tem os metodos e atributos necessarios para funcionamento, como comportamentos {andar, parar, acelerar … } e atributos {rodas, motor, bancos … }, e possuo uma classe Barco que também tem comportamentos {navegar,acelerar,ancorar} e atributos {motor, hélice(s) … }.
No momento em que eu quiser criar um carro-anfíbio, segundo os conceitos de OO, poderei fazer como que ele, simplesmente, herde de Carro e Barco. Mas se eu for fazer em Java terei que implementar as Interfaces que definem os comportamentos de Carro e Barco, assim não reaproveito nenhum comportamento pois terei que implementar tudo.
Alguns podem dizer que podemos apenas declarar os métodos e colocarmos em nossa classe um Carro e um Barco para realizar os comportamentos desejados … mas nem sempre o resultado sai como queremos, e também pode ser muito trabalhoso pois imaginem uma classe como Component que possui 185 métodos declarados.
Eu precisei fazer isso recentemente, não eram 185 métodos mas ainda é deselegante.
Herança multipla acaba que você vai ter várias classes numa hierarquia sem fim!
Prefiro o uso de interface, mesmo que tenha vários metodos depois, há alguns patterns que ajudam a estabelecer um melhor paradigma de programação nessa situação. Interface também não é para se usar sempre, tem que se pensar no POO, se sua classe poder vir a ser herdada por mais alguém posteriormente, ai sim, interface nela e a implemente depois!
Se ela for definitiva não há porque usar interface, então herde dela.
Interface resolve muitos problemas. Mas muitas vezes eh interessante reutilizar algumas implementacoes. Isso da pra fazer com uma combinacao de inteface + composicao. Ou entao, usar os conceitos da AOP…
concordo com rmuliana.
uma coisa q nao curto muito em java é q aparentemente, os desenvolvedores da linguagem presumiram que quem fosse programar nela seriam criancinhas de 5 anos q precisam que o compilador segure na sua mão e vá te conduzindo durante todo o trajeto da codificação do seu programa.
é igual à possibilidade de escolher, por exemplo, passar um tipo primitivo por referencia(sem usar a gambiarra de array)… pode gerar problemas? sim, mas o programador que se vire com isso, ou então a obrigatoriedade de vc tratar certas exceções… eu ficaria feliz se desse um simples warning indicando q eu poderia tratar uma exceção, mas não, o safado nem compilar compila…
voltando ao assunto… eu discordo totalmente da ideia de interfaces substituir herança múltipla… pode até ser q quebre um galho, mas por exemplo, no caso do veículo anfíbio citado por alguém ae, seria mto mais pratico declarar public class VeiculoAnfibio extends Carro, Barco {…} doq usar interfaces
Vale lembrar que o java, apesar de ser “criado para criancinhas de 5 anos”, é uma das mais poderosas linguagens da atualidade.
A Herança Multipla foi deixada de lado tb pq a principal idéia era desenvolver softwares para Eletrodomésticos. Sendo assim seria muito poder de fogo para coisas mais simples. Lembrando que ná época ninguém esperava que o Java fosse ter tal repercussão no mercado, a ponto de chegar onde chegou.
bom, então agora que viram que java é muito mais que programação para eletrodomesticos, e se esse foi mesmo o motivo para deixarem de lado a herança múltipla, entao poderiam adicionar agora
class Dinosaur extends Animal {
void talk() {
System.out.println(“Oh I’m a dinosaur and I’m OK…”);
}
}
// Isso não compila em Java, claro, pois não suporta multipla herança
class Frogosaur extends Frog, Dinosaur {
}
[/quote]
Agora, o problema:
[quote]Animal animal = new Frogosaur();
animal.talk();[/quote]
O que diria nosso amigo Sapossauro? “Ribit, Ribit.” ou “Oh I’m a dinosaur and I’m OK…” ?
Parece que esse problema é conhecido como “Problema do diamante”, eu não conhecia. A causa do problema foi herança múltipla de implementação, mas Java oferece herança múltipla de interface, o que resolve o problema do diamante, e incrementa o polimorfismo do comportamento dos objetos.
O artigo referido tem muito mais coisa, vale a pena gastar o inglês:
hilmilho
no caso de métodos conflitantes, poderia ser usada a assinatura dos métodos para fazer a diferenciação(como quando vc define métodos com o mesmo nome e assinaturas diferentes em uma mesma classe, por exemplo)… se mesmo assim continuar em conflito(como no seu exemplo), o programa poderia nao compilar, ou entao poderia existir o recurso de fazer uma especie de casting especial para forçar a usar o método de uma determinada classe