Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
2
respostas

Chamada de método abstrado

Olá. Na aula 5, lição 3, vimos como utilizar métodos abstrados. Porém, fiquei com uma dúvida na classe ControleBonificacao. Nela, existe o seguinte código:

public class ControleBonificacao {
    private double soma;

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

    public double getSoma() {
        return soma;
    }
}

No caso do método registra, ele chama um método abstrado da classe Funcionario (getBonificao). Neste caso, como funciona/compila se não há implementação na classe Funcionario?

Obrigado!

2 respostas
solução!

Oie Marlos, tudo bem contigo?

Realmente não há implementação na classe "Funcionario" por ela ser abstrata, entretanto a implementação acontece nas classes que herdam "Funcionario", tanto "Gerente", "Designer" e "EditorVideo" fazem uma implementação do método "getBonificacao". Importante lembrar que no final nunca vai ser criado uma instância de "Funcionario" (por conta de ser abstrata) só das classes filhas, por isso o método "registra" recebe como parâmetro uma das classes filhas de "Funcionario", que por conta do polimorfismo, "Funcionario" sendo um tipo mais genérico permite que as classes filhas utilizem uma variável do tipo "Funcionario" como referência.

Por isso no final o método registra poderia ser entendido dessa forma:

public void registra() {
        Funcionario f = new Gerente(); // nesse exemplo aqui ao invés do objeto vir através do parâmetro ele foi instanciado diretamente.
        double bonific = f.getBonificacao();
        this.soma+=bonific;
    }

Espero tenha conseguido responder sua dúvida, se ainda tiver qualquer questão pode mandar por aqui :)

Bons estudos!

Excelente, Igor! Muito obirgado!