Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Saída Inesperada

Pessoal

Implementei o código abaixo para testar o poliformismo. Incluí um sysoutprintln em cada classe, similar ao que o professor fez no exemplo da aula, porém quando executo, o console apresenta duas vezes a informação "bonificação funcionário". a soma final está correta o que indica que o código da classe funcionário foi executado uma única vez como esperado.

public class Funcionario {

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

    public double getBonificacao() {
        System.out.println("bonificação Funcionário");
        return this.salario * 0.05;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public String getCpf() {
        return cpf;
    }
    public void setCpf(String cpf) {
        this.cpf = cpf;
    }
    public double getSalario() {
        return salario;
    }
    public void setSalario(double salario) {
        this.salario = salario;
    }


}

public class Gerente extends Funcionario{

private int senha;


public boolean autentica(int senha ) {

    if (this.senha == senha) {
        return true;
    } else {
        return false;
    }


}

public void setSenha(int senha) {
    this.senha = senha;
}

public int getSenha() {
    return senha;
}
public double getBonificacao() {
    System.out.println("bonificação Gerente");
    return getSalario() *0.2;
}

}

public class Designer extends Funcionario{

private int senha;


public boolean autentica(int senha ) {

    if (this.senha == senha) {
        return true;
    } else {
        return false;
    }


}

public void setSenha(int senha) {
    this.senha = senha;
}

public int getSenha() {
    return senha;
}
public double getBonificacao() {
    System.out.println("bonificação Designer");
    return super.getBonificacao() + super.getSalario();
}

}

public class TesteFuncionario {

public static void main(String[] args) {

    Gerente g1 = new Gerente();
    Funcionario f1 = new Funcionario();
    Designer d1 = new Designer();

    g1.setSalario(1000);
    f1.setSalario(1000);
    d1.setSalario(1000);

    ControleBonificacao controle = new ControleBonificacao();
    controle.Registra(g1);
    controle.Registra(d1);
    controle.Registra(f1);

    System.out.println(controle.getSoma());

}

}

1 resposta
solução!

Olá Maurício, tudo bem com você?

O problema está no método getBonificacao() da classe Designer. Observe que dentro do método getBonificacao() do Designer, temos uma outra chamada para o getBonificacao(), só que dessa vez para o método da superclasse Funcionario:

public double getBonificacao() {
    System.out.println("bonificação Designer");
    return super.getBonificacao() + super.getSalario(); // chamando getBonificacao() de Funcionario
}

Isso faz com que, depois que seja impresso "bonificação Designer", o método getBonificacao() do Funcionario também imprima "bonificação Funcionário" logo em seguida.

public class Funcionario {

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

    public double getBonificacao() {
        System.out.println("bonificação Funcionário");
        return this.salario * 0.05;
    }

Espero que isso ajude. Qualquer dúvida é só avisar!

Forte abraço e bons estudos!!