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

Vantagem do polimorfismo

Boa noite,

Entendi bem a vantagem do polimorfimo como parametro em um metodo, voce o torna generico, entao qlqr classe que venha abaixo da declarada vai aceitar.

Porem, nao consegui enxergar a vantagem para escrever

Funcionario g1 = new Gerente();

ao invés de

Gerente g1 = new Gerente();

` Alguem pode me auxiliar nisso?

7 respostas

E aí José, tudo bem? Assim, vou expor minha humilde opinião, talvez tenha outras pessoas que entendam mais, na minha opinião, essa exemplificação:

Funcionario g1 = new Gerente();

É mais para explicar o que realmente representa o polimorfismo, fazer com que uma especialização possa ser representada por algo mais genérico, algo que seja mais Generalizado, no caso do método, por exemplo, você iria ficar criando vários para atender sua lógica (seja ela relacionada à alguma empresa ou projeto acadêmico), então você usa o polimorfismo para apresentar uma forma de dizer: Olha, para todo FUNCIONARIO, que passar pela porta perguntando sobre seu salário, além de passar pela porta como funcionário, irá ser tratado conforme especificado na sua estrutura (Classe), ou seja, se um gerente usar algum método, esse método vai ser específico do Gerente, é o que a gente encara como associação no tempo de execução, o poder do polimorfismo é exatamente esse, mas lembre-se, existem as interfaces, e uma porção de especificações no Java, espero ter te ajudado. Lembrando, isso não quer dizer que você não possa usar:

Funcionario g1 = new Gerente();

Isso quer dizer, que existem momentos e hora para ser usado, se você perceber que em algum momento você vai precisar usar isso, então talvez seja essa a hora, mas o Polimorfismo é isso: Poder tratar algo específico em algo concreto que o represente.

Abraços.

José, imagine que você tem os funcionários da sua empresa e precisa varrer cada um deles para listar num relatório. Só que alguns funcionários são do tipo Secretaria, outros são do tipo Gerente, outros são do tipo Diretor e outros são do tipo Terceirizado.

Se cada um deles for uma classe independente, que não herda de Funcionario, você terá que fazer um laço para cada tipo. Assim, o código para gerar seu relatório seria +/- assim:

// lista as secretárias
for(int i = 0; i < listaDeSecretarias; i++) {
    System.out.println(listaDeSecretarias[i].getNome());
}
// lista os gerentes
for(int i = 0; i < listaDeGerentes; i++) {
    System.out.println(listaDeGerentes[i].getNome());
}
// lista os diretores
for(int i = 0; i < listaDeDiretores; i++) {
    System.out.println(listaDeDiretores[i].getNome());
}
// lista os terceirizados
for(int i = 0; i < listaDeTerceirizados; i++) {
    System.out.println(listaDeTerceirizados[i].getNome());
}

Já se todas essas classes estenderem Funcionario, você pode criar um único laço varrendo todos os objetos do tipo Funcionario. Uma vez que todos eles (Secretaria, Gerente, Diretor e Terceiriado) podem ser armazenados em um atributo do tipo Funcionario. O laço pra gerar seu relatório ficaria +/- assim:

// imprime todas as classes que estendem Funcionario
for(int i = 0; i < listaDeFuncionarios; i++) {
    System.out.println(listaDeFuncionario[i].getNome());
}

Bem menos código, né?

Qualquer dúvida, só postar.

Abraço.

José, o que foi exposto pelo Emanoel está correto, no entanto, nesse caso, todos os funcionários vão ser impressos, imagine que você precise imprimir só um Funcionário, você criaria um método que recebe um funcionário, ai você poderia passar qualquer um: Secretária, Gerente ou qualquer um que seja Funcionário, espero ter ajudado.

Antonio e Manoel, Obrigado pela resposta, A ideia do polimorfismo eu entendi, No entanto, eu sei que quando escrevemos

Funcionario gerente = new Gerente();

a minha referencia é do tipo funcionario, então ela nao enxergaria metodos que existe somente na minha classe Gerente. Sendo assim não consigo ver a vantagem em declarar desta forma sendo que eu perco os metodos especificos da classe q eu instanciei.

solução!

Boa noite, José! Como vai?

A vantagem, dentre outras coisas, é poder reutilizar a mesma referência para outros funcionários. Por exemplo:

Funcionario f;

if (/* alguma condição */) {
     f = new Gerente();
} else {
     f = new Diretor();
}

// continuo manipulando a referência f ...

Como ambos são funcionários, então posso utilizar a referência f para os dois casos! Claro que isso só será válido de ser usado quando eu não precisar dos métodos específicos de cada classe! Em cenários assim teremos que utilizar referências específicas!

Grande abraço e bons estudos!

Obrigado Gabriel. Era exatamente isto que eu havia pensado, mas não sabia se seria apenas isso. Novamente Obrigado

Por nada, José! Sempre que tiver qualquer dúvida é só mandar aqui no fórum!

Grande abraço e bons estudos!