2
respostas

Já dei uma olhada no tópico anterior, mas continua uma dúvida

Funcionario f = new Gerente();
f.autentica(1234);

Se escrever o código dessa forma, não vai "atrelar" tudo da classe Gerente, então qual a vantagem de utilizar o código dessa forma?

Não seria sempre melhor escrever como Gerente?

Gerente f = new Gerente();
f.autentica(1234);
2 respostas

Cara acontece a seguinte situação: Um gerente é um funcionário?!

A resposta é que sim.

Um gerente é um funcionário, usando a boa orientação a objetos temos o seguinte cenário:

A classe Gerente tem comportamento exclusivos de um gerente, que herda também o comportamento de um funcionário.

Então usando o bom polimorfismo, temos a seguinte afirmação um funcionário que é um gerente.

Eu aconselho você está dando uma olhada nesse artigo: Herança, reescrita e polimorfismo

Oi, Diana

Realmente, nesse exemplo não fica tão evidente a vantagem de usar um tipo mais abrangente (Funcionário) para apontar para um objeto mais especializado (Gerente). Esse exemplo dado no curso foi apenas para te deixar ciente de que é possível você criar um objeto Gerente sendo apontado por um tipo Funcionário. Isso foi só pra você enxergar que você pode referenciar um objeto específico com uma variável de tipo mais abrangente.

Ok, mas qual a utilidade disso? Já que você acaba perdendo a possibilidade de usar métodos específicos da classe Gerente?

Pense na seguinte situação: Você acabou de criar um método e você deseja passar um Funcionário como parâmetro neste método, não importa se é Gerente, Administrador, ou qualquer outro, você somente quer que qualquer Funcionário desses possa entrar ali naquele parâmetro. Você quando criou esse método, também não estava interessada em usar nada de específico das classes que herdam de Funcionário, somente estava interessada em usar métodos comuns a todas as classes que herdam de Funcionário. O que você iria fazer?

Solução 1: Criar um método com parâmetro para cada Funcionário?

public void metodoProGerente (Gerente parametro){
    //corpo do metodo
}

public void metodoProAdministrador (Administrador parametro){
    //corpo do metodo
}

public void metodoProDiretor (Diretor parametro){
    //corpo do metodo
}

Solução 2: Ou criar apenas um método que você possa passar qualquer desses Funcionários?

public void metodoPraQualquerFuncionario(Funcionario parametro){
    //corpo do metodo
}

Veja se entendeu, nesse último método você pode passar Diretor, Administrador, Gerente... Parece bem melhor não é? :)