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

Alternativa ao uso de método nessa situação

Olá galera,

Durante a aula eu gosto de ir acompanhando e programando ao mesmo tempo para entender melhor, e fazer uns certos "aprimoramentos" no código. Na ultima aula de polimorfismo eu tive um certo problema na consulta de bonificação. Segue abaixo o código e o resultado dele:

public class TesteReferencias {

    public static void main(String[] args) {
        Gerente g1 = new Gerente();
        g1.setNome("Roger");
        g1.setSalario(5000);

        Funcionario f1 = new Funcionario();
        f1.setSalario(2000);

        ControleBonificacao controle = new ControleBonificacao();
        controle.registra(g1);
        controle.registra(f1);

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



    }

}

E o resultado:

Exibindo bonificação GERENTE: 
Exibindo bonificação FUNCIONARIO: 
Exibindo bonificação FUNCIONARIO: 
5350.0

Percebi que isso foi devido a eu ter usado um método para consulta de bonificação da classe Funcionario ao invés de ter aplicado a o salário + 5% do salário, a fim de não ser necessário alterar mais de uma classe.

public class Gerente extends Funcionario {
    private int senha;

    public double getBonificacao() {
        System.out.println("Exibindo bonificação GERENTE: ");
        return super.getSalario() + (super.getBonificacao() /*+ (super.getSalario()*0.05*/);

    }

O ponto é, minha linha de pensamento está correta? Existe algo como contornar essa falha seguindo essa minha linha de pensamento?

Obrigado aos que se dispuserem a ajudar. :D

1 resposta
solução!

Boa noite!

Supondo que a classe funcionario seja:

public class Funcionario {

    public double getSalario() {
        // sua lógica ...
    }

    public double getBonificacao() {
        // sua lógica
    }

}

Ao criar uma classe que herda de funcionário você terá acesso aos atributos e métodos públicos e privados, podendo sobrescrever os métodos, como o exemplo abaixo:

public class Gerente extends Funcionario {

    @Override
    public double getBonificacao() {
            System.out.println("Exibindo bonificação GERENTE: ");
            return getSalario() + // nova regra de bonificação

    }

}

Resumindo, ao sobrescrever um método da classe pai, o mesmo não terá o comportamento pré-definido na classe pai, substituindo assim a lógica daquele método na classe filha, onde neste caso o getSalario() da classe Gerente retorna o salario definido para o objeto Gerente, e como o método getBonificação() foi sobrescrito, o mesmo deverá conter a nova lógica de calculo da bonificação do gerente.

Claro, isso podendo ser contornado, criando um método específico para o calculo da bonificação do funcionário onde não seria sobrescrito na classe gerente, assim preservando a lógica do método da classe pai.