Bom dia amigos, cá estou eu estudando OO, cheguei nesse assunto, herança múltipla, o autor cita que o C++ suporta herança múltipla, e no caso de atributos em conflito de nomes ele (o c++) tem uma rotina para isso…
O autor disse que no java não existe herança multipla, falaram que eles contornaram esse problema com as INTERFACES.
Alguém poderia me explicar como INTERFACE no java resolve o problema de herança multipla???
Conforme você vai poder constatar, através do link acima, há uma grande diferença entre interface e herança. Porém se a herança for aplicada de forma organizada, mesmo sem herança multipla, vai ser possivel reaproveitar muito código.
Ex:
Classe SerVivo, tem o metodo, respiração.
Classe Animal, herda respiração da SerVivo.
Classe Cachorro, herda animal e consequentemente SerVivo.
[]s
Alexandre_Gazola
Isso é a questão de “heranca de interface” e “heranca de implementacao”. Java favorece a boa pratica de “heranca de interface” (implements), permitindo a uma classe “herdar” diversas interfaces. Heranca de implementacao (extends), devido a suas varias desvantagens, foi restringida.
abracos
robertoMoraes
como o amigo mencionol no exemplo acima em java voce so herda de uma classe porem
a classe mae pode herdar de outra e assim sucecivamente (respeitando as regras de herança claro)
welitonjose
heim massa ow
posso usar varias interface em varias class
e visa e versa ???
discorpio
Boa tarde a todos.
Alexandre Gazola:
…Java favorece a boa pratica de “heranca de interface” (implements), permitindo a uma classe “herdar” diversas interfaces. Heranca de implementacao (extends), …
abracos
Pra começar, classes não herdam de interfaces, muita gente confunde isso, inclusive eu logo no ínico do meu aprendizado, por pensar que as classes herdam os métodos abstratos de uma interface, quando na verdade, conforme disse o nosso amigo Arthurgermano, as interfaces apenas estabelecem uma obrigação (implementação) dos seus métodos abstrastros como se fosse uma espécie de contrato.
Dentro de todo o paradigma de Orientação a Objeto, com classes, existe e sempre existirá a hierarquia de heranças, uma classe principal, a qual chamamos de classe mãe, é que sempre será o ponto de partida. Dentro do Delphi, a classe mãe é TObject, e no Java é Object.
Quando voce declara uma classe assim:
publicclassMinhaClasse{........}
Implicitamente seria o mesmo que declarar
publicclassMinhaClasseextendsObject{........}
As duas declarações de classes são válidas no Java, sendo a segunda opção desnecessária.
Se as classes herdassem de Interface, esta declaração abaixo geraria erro.
Visto que isso configuraria herança múltipla o que não é permitida no Java.
Muitos desenvolvedores que são considerados Puristas de O.O. acham que a herança múltipla, que foi permitida no C++, violam as características do Polimorfismo, isto pois, voce pode criar um objeto cuja classe herda de duas classes distintas, na hora que voce quiser fazer sobrescrita ou até sobrecarga de métodos que por ventura seja os mesmos nas classes herdadas, de qual classe esta vai identificar, além é claro que sempre vai bater naquele conflito de atributos com o mesmo nome e que estejam em classes de tipo diferentes. Outro fator que viola tal condição é que voce pode tipar um objeto como tipo classe, e tentá-lo instanciar com outro tipo de classe a qual não está na sua linha de hierarquia, onde a multipla herança da mesma pode gerar conflito.
Alexandre_Gazola
Sim, correto. Mas estou me referindo à "heranca’ de interface, que é a nomenclatura usada no GoF para a implementacao de contratos.
Lembro de ter estudado no livro de certificacao da Kathy B. uma comparacao entre heranca simples e multipla. A heranca multipla tem uma implicacao que eles chamam de se nao me engano “problema do diamante…”. A titulo de comparacao com outras linguagens que usam heranca multipla eh uma explicacao bastante simples da razao de java nao ter heranca multipla
fabiocsilva
Acho você está falando do “diamante da morte”
[Classe A][Classe B filha de A] [Classe C filha de A][Classe D filha de B e C]
D não sabe o que fazer com os métodos de A(se pega a implementação orinigal, se pega de B ou C). Se não me engano, C++ pega a implementação da classe filha mais a esquerda, no caso B. Mas cada linguagem resolve esse problema a sua maneira. No caso de java que não permite herança múltipla, D só poderia estender B ou C e mesmo que houvesse um método com a mesma assinatura na outra classe, não faria diferença porque a interface só contém declaração, não definição.
Não sei se fui claro com essa sopa de letrinhas kkkkkkkkk
rmendes08
Sim, correto. Mas estou me referindo à "heranca’ de interface, que é a nomenclatura usada no GoF para a implementacao de contratos.
Só pra reforçar, o James Gosling também usa esse nomenclatura no Java, The Programming Language.
discorpio
Boa noite a todos.
Fabiocsilva, voce não só foi tão claro, como ratificou aquilo que eu disse:
Para endossar o que voce falou, vamos pegar o seu exemplo e usá-lo de forma mais concreta:
publicclassCompextendsJComponent{publicexecuteMensagem(Stringmens){JOptionPane.showMessageDialog(null,mens);}}publicclassJanelaextendsJPanel{publicexecuteMensagem(Stringmens){JOptionPane.showMessageDialog(null,mens);JOptionPane.showMessageDialog(null,"Estou na janela");}}publicclassBotaoextendsJButton{publicexecuteMensagem(Stringmens){JOptionPane.showMessageDialog(null,mens);JOptionPane.showMessageDialog(null,"Estou na Botão");}}publicclassMeuComponenteextendsJanela,Botao{publicexecuteMensagem(Stringmens){JOptionPane.showMessageDialog(null,"Este é meu componente de herança múltipla");}}
No caso acima, as classes Janela e Botao, que herdam de JPanel e JButton respectivamente, ambas herdam da Classe Comp que herdam de JComponent, como JPanel e JButton herdam de JComponent, pelo menos eles estão na mesma linha de hierarquia, contudo cabemos fazer as seguintes perguntas:
1º) O método “executeMensagem(String mens)” presente na classe MeuComponente está sobreescrevendo qual método de mesma assinatura de qual classe (Janela ou Botao) :?: :?: :?:
2º) A classe Janela herda de JPanel e a classe Botao herda de JButton, se a classe MeuComponente herda de ambas, qual interface gráfica MeuComponente vai herdar para se comportar como qual componente (JPanel ou JButton) :?: :?: :?: Pois ambas interfaces da Swing são totatalmente diferentes.
No caso acima, além de não saber qual interface gráfica vai herdar, a linha de herança está totalmente fora da hierarquia, e esta é uma das razões o porque do java não adotar herança múltipla.
Aliás, o Delphi também não adota herança múltipla, face o acima exposto, ao invés disso ambos (Delphi e Java) para suprir essa deficiência da múltipla heranç, assim como disse o nosso amigo Alexandre Gazola, adotaram o sistema de herança entre Interfaces, ou seja, a herança de Interfaces só pode ser feita entra elas mesmas, pois Interface não herda de Object, de nenhuma classe, e por isso pode haver implementação múltipla de Interface
discorpio
Boa noite a todos.
Gente, cometi uma garfe nos códigos que postei e esqueci a sintaxe “void”, eis o código reparado.
publicclassCompextendsJComponent{publicvoidexecuteMensagem(Stringmens){JOptionPane.showMessageDialog(null,mens);}}publicclassJanelaextendsJPanel{publicvoidexecuteMensagem(Stringmens){JOptionPane.showMessageDialog(null,mens);JOptionPane.showMessageDialog(null,"Estou na janela");}}publicclassBotaoextendsJButton{publicvoidexecuteMensagem(Stringmens){JOptionPane.showMessageDialog(null,mens);JOptionPane.showMessageDialog(null,"Estou na Botão");}}publicclassMeuComponenteextendsJanela,Botao{publicvoidexecuteMensagem(Stringmens){JOptionPane.showMessageDialog(null,"Este é meu componente de herança múltipla");}}
ViniGodoy
Não, o C++ não faz nada implícito. Ele exige que você especifique completamente o caminho, na hora que estiver fazendo a chamada ou subscrição. E é isso que torna a programação um inferno, daí o problema.
Agora, no C++ também existe o conceito de interface. Se as superclasses só contiverem métodos virtuais puros e não contiverem atributos, não haverá problemas em fazer herança múltipla, nem com o diamante da morte. Inclusive, é uma das recomendações do Effective C++ que herança múltipla só seja feita com implementações desse tipo.