Herança Multipla no Java

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???

Se possível postar um exemplo… agradeço!

olá brother…

isso mesmo java suporta somente herança simples ou seja só pode herdar de uma classe, porém pode implementar diversas interfaces.

Interface é um contrato, onde o sua classe se compromete em IMPLEMENTAR TODOS os métodos descritos na interface.

Exemplo de interface

public interface ExemploInterface {

    public void metodo1(int a, int b);
    
    public void metodo2();
    
}

Exemplo de uma classe que implementa interface

public class ExemploClasse implements ExemploInterface{

    public void metodo1(int a, int b){
        System.out.println(a*b);
    }
    
    public void metodo2(){
        System.out.println("fazendo algo..");
    }
    
}

Agora o exemplo de utilização realmente. A força está no polimorfismo note neste exemplo:

public class ExemploPoderoso {

    public void metodoPolimorfico(ExemploInterface a){
        a.metodo1(2, 3);
        a.metodo2();
    }
    
}

Agora você pode passar qualquer classe “por parametro” que implemente ExemploInterface que o método “metodoPolimorfico” irá funcionar corretamente!

Espero ter ajudado.

Boa tarde,

Segue abaixo um link, do próprio, GUJ:

http://www.guj.com.br/article.show.logic?id=123

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

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

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)

heim massa ow

posso usar varias interface em varias class

e visa e versa ???

Boa tarde a todos.

[quote=Alexandre Gazola]
…Java favorece a boa pratica de “heranca de interface” (implements), permitindo a uma classe “herdar” diversas interfaces. Heranca de implementacao (extends), …
abracos [/quote]

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:

  public class MinhaClasse {
       ....
       ....
  }

Implicitamente seria o mesmo que declarar

  public class MinhaClasse extends Object {
       ....
       ....
  }

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.

     public class MinhaClasse extends JFrame implements ActionListener {
          ...
          ...
     }

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.

Sim, correto. Mas estou me referindo à "heranca’ de interface, que é a nomenclatura usada no GoF para a implementacao de contratos.

"The Gang of Four Design Patterns book discusses at length replacing implementation inheritance (extends) with interface inheritance (implements)" (http://www.javaworld.com/javaworld/jw-08-2003/jw-0801-toolbox.html)

abracos

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

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

Sim, correto. Mas estou me referindo à "heranca’ de interface, que é a nomenclatura usada no GoF para a implementacao de contratos.

"The Gang of Four Design Patterns book discusses at length replacing implementation inheritance (extends) with interface inheritance (implements)" (http://www.javaworld.com/javaworld/jw-08-2003/jw-0801-toolbox.html)

abracos[/quote]

Só pra reforçar, o James Gosling também usa esse nomenclatura no Java, The Programming Language.

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:

public class Comp extends JComponent {
       public executeMensagem(String mens){
               JOptionPane.showMessageDialog(null,mens);
       }
}

public class Janela extends JPanel {
       public executeMensagem(String mens){
              JOptionPane.showMessageDialog(null,mens);
              JOptionPane.showMessageDialog(null,"Estou na janela");      
       }
}

public class Botao extends JButton {
       public executeMensagem(String mens){
              JOptionPane.showMessageDialog(null,mens);
              JOptionPane.showMessageDialog(null,"Estou na Botão");      
       }
}

public class MeuComponente extends Janela, Botao {
       public executeMensagem(String mens){
              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.

Outro caso de violação de Polimorfismo:

public class Janela extends JFrame {
       .....
}

public class Painel extends JPanel {
      ....
      ....
}

public class meuframe extends Janela, Painel {
      ...
      /* Oops, Janela herda de JFrame que herda de Frame;
          Painel herda de JPanel que herda de JComponent.
          Java lang.Exception Types Mismatch  (Tipos incompatíveis) */
}

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

Boa noite a todos.

Gente, cometi uma garfe nos códigos que postei e esqueci a sintaxe “void”, eis o código reparado.


public class Comp extends JComponent {
       public void executeMensagem(String mens){
               JOptionPane.showMessageDialog(null,mens);
       }
}

public class Janela extends JPanel {
       public void executeMensagem(String mens){
              JOptionPane.showMessageDialog(null,mens);
              JOptionPane.showMessageDialog(null,"Estou na janela");      
       }
}

public class Botao extends JButton {
       public void executeMensagem(String mens){
              JOptionPane.showMessageDialog(null,mens);
              JOptionPane.showMessageDialog(null,"Estou na Botão");      
       }
}

public class MeuComponente extends Janela, Botao {
       public void executeMensagem(String mens){
              JOptionPane.showMessageDialog(null,"Este é meu componente de herança múltipla");      
       }
}

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.

No Java, esse conceito só se tornou explícito.