Extender Mais de Uma Classe

Galera surgiu uma duvida um tanto tosca, hehehehe

preciso que uma classe extenda outras 4 classes como posso fazer isso se o java não suporta eranças multiplas

tem como?

Nao suporta pq nao tem sentido vc HERDAR de mais de um… a nao ser que estejamos falando de um mutante, com DNA composto.

Talvez o motivo de sua pergunta venha de como ‘herdar’ comportamentos. Nao verdade nao seria ‘herdar’, seria implementar.

Procure estudar sobre INTERFACES.

Em vez de herdar, usa composição. Coloca instâncias dessas classes que você quer herdar como atributos e implementa os métodos que elas implementam, delegando pra elas.

1 curtida

Java não usa esquema de herança multipla, por isso que são usadas as Interfaces, olhe os Artigos / Tutoriais do GUJ e outros sites pra dar uma estudada.

Olá!

Se você tem tanta vontade assim de fazer uma classe herdar de outras 4, faça uma herdar da outra…

Classe5 extends Classe4
Classe4 extends Classe3
Classe3 extends Classe2
Classe2 extends Classe1

a Classe5 herda de todas as outras :smiley:

Claro que se não tem um BOM motivo pra fazê-lo, isso não passa de pura e simples gambiarra.

Abraços

[quote=Link_pg]Olá!

Se você tem tanta vontade assim de fazer uma classe herdar de outras 4, faça uma herdar da outra…

Classe5 extends Classe4
Classe4 extends Classe3
Classe3 extends Classe2
Classe2 extends Classe1

a Classe5 herda de todas as outras :smiley:

Claro que se não tem um BOM motivo pra fazê-lo, isso não passa de pura e simples gambiarra.

Abraços[/quote]

Como diriam alguns amigos meus: “Se a linguagem lhe permite, não é gambiarra…”
Mas convenhamos, o melhor solução e usar Interfaces!

Imagine que as classes 1 e 2 tem o método doIt(), com a mesma assinatura, qual doIt vale?

No seu caso, vc poderia resolver assim:

Classe1 implementa Interface1{}
Classe2 implementa Interface2{}
Classe3 implementa Interface3{}
Classe4 implementa Interface4{}

ClasseQueHerdaAsOutras implements Interface1, Interface2, Interface3, Interface4 {
private Interface1 minhaClasse1 = new Classe1();
private Interface2 minhaClasse2 = …;
private Interface3 minhaClasse3 = …;
private Interface4 minhaClasse4 = …;
}

Ou seja, vc trocou herança por composição :slight_smile:

ps: editei para ficar melhorzinho :slight_smile:

Boa… composição é uma solução legal!

java não tem herança multipla pois fazer a mesma merda que o C++ seria algo pessimo… imagine o seguinte cenario:

class A {
  
  public void fazAlgo() {
     System.out.println("faz algo de A");
  }
}

class B {
    public void fazAlgo() {
     System.out.println("faz algo de B");
  }
}

class C extends A, B {
   
  public static void main(String args[]) {
      C c = new C();
      c.fazAlgo();
  }
}

Pergunto-lhe como a VM vai saber qual metodo
fazAlgo() vai executar???

ja com interface como em interfaces não á implementações apenas o esqueleto do metodo mesmo que tenha 2 intefaces com o mesmo metodo o unico metodo sera implementado na classe que implementar esta interface assim não tera este problema…

exemplo:


interface fazAlgo {
	public void fazAlgo();
}

interface B {
	public void fazAlgo();
}

public class Teste implements A, B{
	
	public void fazAlgo() {
		System.out.println("Faz algo em Teste");
	}
	
	public static void main(String[] args) {
	   Teste t = new Teste();
	   t.fazAlgo(); //resultado: Faz algo em Teste
	}
}

vejamos que como interface não implementa nada dentro dos metodos este problema citado no exemplo anterior nao ocorre…

Este é o famoso Gambi desing pattern Varalzão

Eu estava pensando em alguma utilidade pra herança múltipla e acho que tem 2 casos que seria legal usá-la:

  • RadioRelógio, que é um rádio e um relógio ao mesmo tempo, nem rádio nem relógio são comportamentos, são objetos mesmo…
  • Carteira, que é ao mesmo tempo uma cadeira e uma mesa…

Se alguém tem uma solução pra esse problema SEM herança múltipla, por favor posta ai :smiley:

Acho que entendi sua duvida.
Para responder sua pergunta, pense que, um Radio-relogio, tem um objeto Radio e um objeto relogio, como partes isoladas, ok?

Primeiro, um pouco de codigo. Apenas como exemplo, nem vou considerar tipos…

Primeiramente, a classe Relogio:

Class Relogio {

private String horas;

public String getHoras() {
    return horas;
}

Classe Radio:

[code]Class Radio {

private String estacao;
private Banda banda;  // AM, FM, OC...

public String getEstacao() {
return estacao;
}

public void buscaProximaEstacaoValida() {
estacao = Banda.getProximaEstacao(proxEstacao);
}

public void buscaEstacaoValidaAnterior() {
estacao = Banda.getProximaEstacao(proxEstacao);
}
[/code]

Juntando tudo:

Class RadioRelogio {

    private Relogio relogio;
    private Radio radio;

    private getHoras() {
        return relogio.getHoras();
    }

    private buscaProximaEstacao() {
        return radio.buscaProximaEstacaoValida();
    }

}

No exemplo, temos uma classe Relogio, valida, que pode ser instanciada em qualquer outra classe que vc necessite (RelogioPulso, RelogioPonto, etc).

O legal da interface, sao os metodos de Relogio, para implementar em outros tipos de Relogio, por exemplo analogico e digital:

[code]Interface Relogio {
public String getHoras();
public void ajustarHora(String hora);
public void ajustarMinuto(String minuto);
}

Class RelogioAnalogico implements Relogio {
public String getHoras() { implementacao para relogio analogico aqui }
public void ajustarHora(String hora) { implementacao para relogio analogico aqui }
public void ajustarMinuto(String minuto) { implementacao para relogio analogico aqui }
}

Class RelogioDigital implements Relogio {
public String getHoras() { implementacao para relogio digital aqui }
public void ajustarHora(String hora) { implementacao para relogio digital aqui }
public void ajustarMinuto(String minuto) { implementacao para relogio digital aqui }
}
[/code]

Voltando ao nosso primeiro exemplo, podemos concluir que, se relogio agora eh uma interface, nao interessa se ele eh analogico ou digital, para nosso radio-relogio. Ele vai aceitar qualquer implementacao, basta que voce passe para ele uma instancia de RelogioAnalogico ou RelogioDigital, via setter, por exemplo:

[code]Class RadioRelogio {

private Relogio relogio;
private Radio radio;

public void setRelogio(Relogio relogio) {
    this.relogio = relogio;
}

}
[/code]

Ainda, voce pode dar a funcionalidade de Relogio, para o nosso RadioRelogio, simplesmente implementando sua interface:

[code]Class RadioRelogio implements Relogio {

private Relogio relogio;
private Radio radio;

public void setRelogio(Relogio relogio) {
    this.relogio = relogio;
}

private getHoras() {
    return relogio.getHoras();
}

public void ajustarHora(String hora) { 
    relogio.ajustarHora(hora)
}

public void ajustarMinuto(String minuto) { 
    relogio.ajustarMinuto(minuto);
}

}
[/code]

Veja que na verdade, quem executa o metodo, eh o proprio relogio, sem ter que recodificar. Isso implica que, qualquer modificacao que porventura se faca necessaria nas implementacoes de relogio, nao terao impacto em nosso RadioRelogio. Como uma interface, vc pode implementar um “Falso” relogio, apenas para testar se as funcionalidades especificas de seu RadioRelogio estao ok.

Concluindo, a grande vantagem nesse exemplo, eh poder utilizar um RelogioAnalogico, como relogio de pulso, como componente de um radio-relogio, como relogio de parede. Sua implementacao funciona para todos eles. E voce nao precisou de heranca de classe para fazer isso. Se vc reparou, a Classe Banda jah eh uma implementacao semelhante, onde temos varias bandas (AM,FM,OC, etc) e cada uma com sua implementacao. Podemos concluir que Banda tambem eh uma interface, ou, pelo menos, seria sua melhor solucao de modelagem sugerida pelo problema.

Abracos!!!