Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida sobre Polimorfismo

Pessoal, tenho uma dúvida. Conheço bem a ideia do polimorfismo, e a utilidade dele para criar um método que receba como parametro as classes mais altas ou interfaces. No entanto, minha dúvida seria na execução, no dentro do metodo main mesmo. Eu sei que quando escrevemos (Considerem que a classe Gerente estende Funcionario)

Funcionario gerente = new Gerente();

a minha referencia é do tipo funcionário, então ela não enxergaria os métodos que existem somente na minha classe Gerente. Sendo assim não consigo ver a vantagem em declarar desta forma sendo que eu perco os métodos específicos da classe q eu instanciei.

Alguém pode me explicar isso? Ou me dizer se isso funciona, mas não é uma boa pratica, o correto seria fazer:

Gerente gerente  = new Gerente();
3 respostas

Oi , Jose

A vantagem do polifmorfismo está em você poder isolar atributos genéricos em uma classe e poder utilizá-los em outras mais especificas. Quando você diz que a classe Gerente estende Funcionario, está passando todos os métodos que estão atrelados a um funcionário, além dos que podem ser implementados dentro da própria classe, quando você instância um novo gerente está implicito que ele é um funcionário, porém ele pode ser modificado de acordo com a necessidade.

Leonardo, Obrigado pela resposta. No entanto, ainda não esta muito claro pra mim, deixa eu exemplificar:

Eu tenho as classes abaixo:

public class Funcionario {

    private double salario;

    public double totalGanhoAno(){
        return this.salario * 12;
    }

    public double getSalario() {
        return salario;
    }

}
public Gerente extends Funcionario {

    public double calculaPLR(){
        return super.getSalario() * 0.5;
    }

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

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

        f1.calculaPLR(); //Não compila porquê a referencia f1 não enxerga esse metodo.
        g1.calculaPLR(); //Compila Normalmente.

    }
}

O que eu não consegui entender ainda é, porque eu iria escrever desta forma "Funcionario f1 = new Gerente();" sendo que eu nao consigo utilizar os metodos que só existem dentro da classe Gerente, no caso o metodo "calculaPLR()"?

solução!

Porque nesse caso você está instânciando um objeto do tipo funcionário como gerente o que, por mais que seja possível, eu acredito que não faz sentido já que um funcionário por si só é algo genérico. O correto seria que essa classe Funcionario fosse abstrata, isso impediria que ela pudesse ser instânciada e ela existiria apenas para ser herdada.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software