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

O código está ok?

Bom, depois de rever a aula algumas vezes e não entender com clareza o que estava de fato acontecendo, decidi colocar a mão na massa e tentar seguir minha própria logica na tentativa de fazer funcionar.

O resultado:

Classe funcionário


public class Funcionario {
    private String nome;
    private String cpf;
    private double salario;

    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 double bonificacao(){
        return this.salario * 0.05;    
    }    
}

Classe gerente:


public class Gerente extends Funcionario {

    public double bonificacao(){
        return super.getSalario() * 0.1;
    }
}

Classe do controle da bonificação:


public class ControleBonificacao {
    private double soma;

    public double controle(Funcionario funcionario) {
        return this.soma += funcionario.bonificacao();
    }
    public double getSoma() {
        return soma;
    }
}

E por fim a classe dos testes:


public class Testes {
    public static void main(String[] args) {
        Funcionario funcionario = new Funcionario();
        Funcionario gerente = new Gerente();
        ControleBonificacao controle = new ControleBonificacao();

        funcionario.setSalario(1000);
        System.out.println("Bonificação padrão do funcionario: 5% de R$" + funcionario.getSalario() + " = R$" + funcionario.bonificacao());

        gerente.setSalario(1000);
        System.out.println("Bonificação padrão do gerente: 10% de R$" + gerente.getSalario() + " = R$" + gerente.bonificacao());

        controle.controle(funcionario);
        controle.controle(gerente);
        System.out.println("A soma de todas as bonificações é de R$" + controle.getSoma());
    }
}

O que quero é a opinião de uma perspectiva diferente para saber se essa logica segue a mesa linha de raciocínio proposta, e, caso sim, se segue as "boas praticas".

1 resposta
solução!

Olá Samuel, tudo bem?

Então, em relação à polimorfismos e boas práticas, está tudo de acordo.

Apenas uma observação, quando estamos utilizando um tipo mais genérico na instânciação acabamos nos limitando à esse tipo definido. Como o que ocorre nessa parte na classe Testes()

 Funcionario gerente = new Gerente();

Nesse caso, como Gerente extende a classe Funcionario não ocorre nenhum problema na utilização de métodos bonificacao(), já que ele foi declarado na classe Funcionario()

Porém se a classe Gerente possuísse algum método além do bonificação não seria possível utiliza-lo como por exemplo:

public class Gerente extends Funcionario {
    public double bonificacao() {
        return super.getSalario() * 0.1;
    }
    public double dobraBonificacao() {
        return bonificacao() * 2;
    }
}

Dessa forma o método dobraBonificacao() não estaria disponível para uso dentro da classe Teste porque o tipo da referencia gerente apesar de utilizar uma instância de Gerente() é do tipo Funcionario() e portanto só pode utilizar métodos declarados nessa classe.