Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Aplicando polimorfismo

Eu tenho o seguinte bloco de código: public static void main(String[] args) {

    Gerente g = new Gerente();
    g.setNome("Marcos");
    g.setSalario(5000.0);

    Funcionario f = new Funcionario();
    f.setSalario(2000.0);

    EditorDeVideo ev = new EditorDeVideo();
    ev.setSalario(2500.0);

    ControleBonificacao controle = new ControleBonificacao();
    controle.registra(g);
    controle.registra(f);
    controle.registra(ev);

}

Class: Funcionário public class Funcionario {

private String nome;
private String cpf;
protected double salario;

public double getBonificacao() {
    System.out.println("Chamando FUNCIONARIO");
    return this.salario * 0.1;
}

} Class: Gerente public class Gerente extends Funcionario { private double senha;

public boolean autentica(int senha){
    if(this.senha == senha){
        return true;
    }else{
        return false;
    }
}

public double getBonificacao(){
    System.out.println("Chamando GERENTE");
    return super.salario * 1 + 150;
}

}

Class: Controle Bonificação

public class ControleBonificacao {

private double soma;

public void registra(Funcionario f) {
    double boni = f.getBonificacao();
    this.soma = this.soma + boni;
}

public double getSoma(){
    return this.soma;
}

}

Eu não entendi, como e porque é exibido: Chamando GERENTE, é porque a classe herda funcionário?

2 respostas

Oi Thailan, vou tentar explicar conforme entendi. As classes Gerente e EditorDeVideo herdam de Funcionario por serem uma especificação de Funcionario, assim como poderíamos ter também Analista, Contador e outras. Nesse caso os comportamentos comuns ficam em Funcionaário enquanto o que for especifico de cada classe deve ficar nela, e assim evitamos duplicidade de código.

Por serem classes que herdam de Funcionario, podemos utilizar as instancias dessas classes ao chamar o método registra da classe ControleBonificacao. E isso é ótimo por que caso seja preciso adicionar um novo tipo de funcionário não precisamos alterar a classe controle de bonificação, apenas herdar de Funcionário.

Neste caso está sendo exibido "Chamando GERENTE" pois a classe gerente também possuí uma implementação do método getBonificacao(), e assim o java vai chamar o método da classe mais especifica, por ser uma sobrescrita do método mais geral.

Espero ter ajudado.

solução!

Isso, é porque você herdou a classe Funcionario

Na sua classe Funcionario você possui o método:

public double getBonificacao() {
    System.out.println("Chamando FUNCIONARIO");
    return this.salario * 0.1;
}

Na sua classe GERENTE você possui o método:

public double getBonificacao(){
    System.out.println("Chamando GERENTE");
    return super.salario * 1 + 150;
}

Portanto nesse trecho de código:

ControleBonificacao controle = new ControleBonificacao();
    controle.registra(g);
    controle.registra(f);
    controle.registra(ev);

Primeiro vai printar na tela Chamando gerente e em seguida, chamando funcionario... Basicamente o Java faz isso automático pra você, pois você possui o mesmo método (getBonificacao()) em diferentes classes (Funcionario e Gerente), então ele vai dar a prioridade pra chamar o método que está na classe que você instanciou, ou pela ordem que você chamou...

ControleBonificacao controle = new ControleBonificacao();
   controle.registra(g); //Chamando Gerente
     controle.registra(f); // Chamando Funcionario 
    controle.registra(ev);

Quer fazer um teste ? Exclui ou comenta o getBonificacao() da classe Gerente e vê o resultado... Ele ainda vai te trazer um resultado, mas baseado da classe Funcionario. Um outro teste é inverter, exemplo:

ControleBonificacao controle = new ControleBonificacao();
 controle.registra(f); // Chamando Funcionario 
  controle.registra(g); //Chamando Gerente
    controle.registra(ev);