Simulação de Herança Multipla, como fazer?

Oi gente, tudo bem,

sei que java é uma linguagem que não aceita herança multipla, mas gostaria de usar em um projeto meu, e ja ouvi falar que é possivel simula-la atraves do uso de interfaces

no caso a minha classe está assim

public class PessoaById extends GravaPessoas

mas queria que essa unica classe herdasse varios outras classes que eu possuo, alguém tem alguma ideia de como fazer?

Você pode criar n interfaces e, no momento de declarar uma classe, fazer os implements delas

public Interface IFace{
//logica aqui
public void metodo1();
}
public Interface IFace2{
//logica aqui
public void metodo2();
}
public Interface IFace3{
//logica aqui
public void metodo3();
}
public Interface IFace4{
//logica aqui
public void metodo4();
}
public Class ImplementsIFace implements IFace, IFace2, IFace3, IFace4{
//implementação dos métodos aqui
}

[quote=fabiobh]Oi gente, tudo bem,

sei que java é uma linguagem que não aceita herança multipla, mas gostaria de usar em um projeto meu, e ja ouvi falar que é possivel simula-la atraves do uso de interfaces

no caso a minha classe está assim

public class PessoaById extends GravaPessoas

mas queria que essa unica classe herdasse varios outras classes que eu possuo, alguém tem alguma ideia de como fazer?[/quote]
Ah, e esta classe não irá herdar, ela apenas terá de implementar os métodos assinados em cada interface.

A forma mais próxima de herança múltipla em java é a citada acima!

Minha intenção em tentar usar henraça multipla é para poder aproveitar variaveis que eu ja criei em outras classes

por exemplo:

public class GravaEventos {

    private Integer eve_id;
    private String eve_nome;
//outros metodos
}
public class GravaCargo {

    private Integer car_id;
    private String car_nome;
    private String car_tipo;
//outros metodos
}
public class GravaEstado {

    private Integer est_id;
    private String est_nom;
    private String est_sigla;
//outros metodos
}
//outras classes

a minha inteção era pegar todos essa variaveis ja criadas e reusa-las em uma unica classe, que se eu conseguisse iria me poupar muito trabalho, pois caso eu nao consiga, terei de criar todos as variaveis novamente na minha nova classe

mas se você implementa a classe, qual o problema?

Claro, economizar bits de memória para variáveis mas ter de reimplementar todos os métodos é um modo muito inteligente de programar. #Ironic

Camarada, não tem por que economizar, isto poderá até te causar problemas quando for efetuar operações com bancos de dados, por exemplo.
O grande problema de herança múltipla é com relação à métodos, se você hedasse duas classes que possuem um método com mesmo nome e assinatura, como faria?
Por exemplo

public class Soma{
  public double res;
  public double calc(double a, double b){
   res = a + b;
   return res;
  }
}
public class Subtracao{
  public double res;
  public double calc(double a, double b){
   res = a - b;
   return res;
  }
}

Entendeu? Qual método a classe filha herdaria?

Java nao permiti multipla herança porque poderia causar conflito
Exemplo dois metodos iguais nas classes pais e uma classe filha herdando-os

Classe Pai - - - - - - - - - Classe pai
Classe Filha

Mas para isso voce pode implementar varias interfaces em uma classe , se as interFaces possuir os mesmos métodos sera obrigatório a classe que a implementa cria apenas 1 método .

mas voce pode ter uma herança tipo cascata por exemplo

[code]public class Pessoa {
//Métodos e Atributos comuns a pessoa
}

public class Cliente extends Pessoa{
//Métodos e Atributos comuns a pessoa
}
public class Funcionario
//Métodos e Atributos comuns a pessoa
}
public class Gerente extends Funcionario{
//que automaticamente ja extends de Pessoa
//Métodos e Atributos comuns a pessoa
}[/code]

no meu projeto eu faço o seguinte usando a herança simples


public class ConsultaGeral extends GravaPessoas{

//algumas variaveis exclusivas deste metodo

public void pesquisaUnica() {        
        int a = getCapturaid();
        Pessoas obj_pessoa = (Pessoas) sessao.get(Pessoas.class, a);
        
        setPes_nom_completo(obj_pessoa.getPes_nom_completo());
    }

é no metodo
setPes_nom_completo(obj_pessoa.getPes_nom_completo());
que está o diferencial da herança pra mim, eu posso setar essa variavel no minha tela(no meu projeto web que uso JSF 2), sem precisar criar essa variavel na minha classe

esse metodo setPes_nom_completo é da classe GravaPessoa, ele é o setter da variavel pes_nom_completo, e fazendo isso posso setar seu valor na tela sem precisar criar uma nova variavel na classe ConsultaGeral

Tudo bem, é algo viável você ter uma herança de Pessoa para Cliente, Funcionario.
Agora, querer colocar uma classe Pessoa, Endereco, Telefone e fazer com que um Cliente herde tudo, é meio fora da casinha.
Nesse caso, a relação de Telefone e Endereco é composição (um Cliente é filho de Pessoa e é composto, entre outros, por Telefone - uma List - e por Endereco - uma List -, pois pode ter mais de um Telefone e mais de um Endereco).

Entendeu?

Acho q entendi galera, vlw pelas dicas

.

[quote=drsmachado ]Agora, querer colocar uma classe Pessoa, Endereco, Telefone e fazer com que um Cliente herde tudo, é meio fora da casinha.

[/quote]
Casos como este associação resolveria o problema facilmente.

[quote=fabiobh]Minha intenção em tentar usar henraça multipla é para poder aproveitar variaveis que eu ja criei em outras classes

por exemplo:

public class GravaEventos {

    private Integer eve_id;
    private String eve_nome;
//outros metodos
}
public class GravaCargo {

    private Integer car_id;
    private String car_nome;
    private String car_tipo;
//outros metodos
}
public class GravaEstado {

    private Integer est_id;
    private String est_nom;
    private String est_sigla;
//outros metodos
}
//outras classes

a minha inteção era pegar todos essa variaveis ja criadas e reusa-las em uma unica classe, que se eu conseguisse iria me poupar muito trabalho, pois caso eu nao consiga, terei de criar todos as variaveis novamente na minha nova classe[/quote]

Esse parece um típico caso em que o uso da herança seria totalmente incorreto.

Herança não deve ser usada para reaproveitar métodos ou variáveis, e sim para indicar uma relação de É UM.

Por exemplo, isso está Ok:

class Cachorro extends Animal { // Beleza, cachorro É UM Animal ! }

Mas isso não!

class Cachorro extends Palhaço { // Cachorro não é um Palhaço, isso é apenas uma gambiarra. // Já que ambos fazem coisas engraçadas, vou aproveitar o método fazerCoisasEngracadas() da classe Palhaco }

Aí você me pergunta:

  • Então você vai duplicar todo o código, seu idiota?
  • Calma, não precisa ficar nervoso, existe um bom jeito de fazer isso.
class FazedorDeCoisasEngracadas {
    void fazerCoisasEngracadas() {
      ....
    }
}
class Cachorro {
    FazedorDeCoisasEngracadas graca = new FazedorDeCoisasEngracadas();
    //... aqui vai mais código com as atividades típicas de um cachorro
    //Posso utilizar o método fazerCoisasEngracadas() sem problema.
}
class Palhaco {
    FazedorDeCoisasEngracadas graca = new FazedorDeCoisasEngracadas();
    //... aqui vai mais código com as atividades típicas de um palhaço
    //Posso utilizar o método fazerCoisasEngracadas() sem problema.
}

Nunca é demais citar o nosso querido livro EFFECTIVE JAVA:

OBS: Enquanto eu digitava o drsmachado e o ederfreitas disseram basicamente a mesma coisa que eu.
Mas vou deixar minha resposta aí porque deu o maior trabalho! :slight_smile: