1
resposta

[Projeto] Exercicio 4 por trás dos panos

Muitas dúvidas aqui sobre isso e vou compartilhar como interpretei esse exercicio...

Na video-aula tivemos o método registra com parâmetro do tipo Funcionario que é funcional para todos as referências às classes filhas (como Gerente):

public class ControleBonificacao {

    private double soma;

    public void registra(Funcionario abc) { 
        double bonificacao = abc.getBonificacao();  
        this.soma = soma + bonificacao; 
    }
    public double getSoma() {
        return soma;
    }
}

Nesse caso, é possível utilizar

public class TestaControle {
    public static void main(String[] args) {

        Funcionario g = new Gerente();
        g.setSalario(5000.0);

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

        System.out.println("Soma de bonificacoes: R$" + controle.getSoma());
    }
}

Mas não devemos ficar com a mente fixa no exercicio da video-aula. Esse aqui é um novo exercicio que quer que pensemos como está escrito o método registra.

Se o código não está compilando, então o método não foi feito com base em Funcionario.

Por trás dos panos ele estaria assim:

public class ControleBonificacao {

    private double soma;

    public void registra(Gerente abc) { 
        double bonificacao = abc.getBonificacao();  
        this.soma = soma + bonificacao; 
    }
    public double getSoma() {
        return soma;
    }
}

Gerente ou qualquer outra classe filha no lugar de Funcionario.

Caso esteja incorreto por favor corrijam. Obrigado.

1 resposta

Olá André, tudo bem?

Perfeito! Quando escrevemos o método registra recebendo um Gerente como parâmetro

public void registra(Gerente abc) { 
        double bonificacao = abc.getBonificacao();  
        this.soma = soma + bonificacao; 
    }

Este método passa a aceitar apenas referências a objetos do tipo Gerente. No entanto, quando este método recebe como parâmetro um objeto Funcionario:

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

Este método aceita qualquer Funcionario, isto é, qualquer objeto do tipo Funcionario e tipos filhos deste, como no caso o Gerente. A isso damos o nome polimorfismo, pois o objeto pode ser de diferentes tipos.

Atenção: apesar de o método registra() aceitar qualquer Funcionario e seus filhos, ele conhece apenas o comportamento da referência passada a ele, ou seja, só é possível acessar os métodos que existem dentro da classe Funcionario. Isto é, caso haja algum comportamento específico de uma classe filha, o Java não vai reconhecer. Os métodos acessíveis a partir de uma referência são apenas os métodos contidos em sua classe, sendo assim, o polimorfismo é uma alternativa muito interessante quando queremos que um método afete objetos de vários tipos baseado em um comportamento parecido deles.

Portanto, é sempre interessante pensar na estrutura hierárquica das classes: quem é a classe mãe? E as classes filhas?, pois o polimorfismo só funciona quando estamos descendo a hierarquia. Todo Gerente é um Funcionario, mas nem todo Funcionario é um Gerente.

Em caso de dúvidas, fico à disposição.

Um grande abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!