Duvida sobre Polimorfismo

6 respostas
pooobjetojava
P

Li varios outros posts sobre polimorfismo por aqui, mas continuo sem entender algumas coisas, vou dar um exemplo e ir fazendo perguntas ao longo dele :
Um programa com 4 classes , Escola - Pessoa - Aluno - Professor, onde Aluno e Professor herdam de Pessoa, Pessoa tem os atributos -> Nome, CPF, Aluno -> Matricula, Professor -> Salario, Escola -> ArrayList listaPessoas, a ideia q eu tenho de polimorfismo é q basicamente serve pra q em vez de precisar fazer uma lista de Alunos e outra de Professores pra essa escola eu consiga colocar todos em uma unica lista de pessoas e na hr q for chamar usar o “instanceof” pra saber com qual estou lidando, mas quando coloco em pratica nao consigo chamar nenhum atributo especifico de Aluno ou Professor pela instancia do listaPessoas, aparecem apenas o de pessoa, quando eu armazeno um Aluno ou Professor em um listaPessoas ele converte pra pessoa e eu perco os dados ? se sim, tem como solucionar isso ? estou meio perdido em Polimorfismo, entao se tudo isso q falei nao fizer sentido nenhum teria como tentar explicar como realmente funciona ?

6 Respostas

A

Se usar o instanceof é filtro, não é polimorfismo.
A coisa mais legal que ja vi em java é generics e WildCards depois de uma olhada, ajuda de mais.
Voltando ao assunto.
Pelo que percebi, professor é profissão. Portanto, nao pode extender de pessoa.
A escola seria equivalente ao local de trabalho.
A linguagem natural embora poderosa pode ser ambigua.
Por isto pense que professor deve extender de profissão e não de pessoa.
Poste o que ja fez.
Ainda terá o problema da identidade pra entender.

A

A idéia básica do polimorfismo é justamente você ignorar o tipo específico e usar um comportamento (método) comum entre duas classes que sao filhas da mesma classe ou implementam a mesma interface.

No seu exemplo, vamos imaginar que tanto alunos como professores precisam confirmar presença. O aluno confirma presença, dizendo presente na sala de aula quando um professor pergunta o nome. Já um professor tem que bater cartao na diretoria. Nesse caso, você usaria polimorfismo, colocando alunos e professores na lista de pessoas e chamando o método confirmarPresenca para cada pessoa. Você nao se importa como uma pessoa confirma presença, apenas que ela sabe fazer isso.

A

@AbelBueno, não tenho a intenção de estar correto, mas vou manifestar uma avaliação considerando a taxonomia (o estudo das classes)

Vide: http://www.les.inf.puc-rio.br/wiki/images/f/fc/POO-04.pdf folhas 10.

Assim, no que se refere à orientação a objeto entendo deve ser tratada e excluída a ambiguidade do sentido.

Então, se a classe Professor extender Pessoa, o Professor deve possuir um atributo do tipo profissão.

Se a classe Professor extender de Profissão, as instâncias do tipo Professor não podem ser pessoas.

A situação da classe Professor é simplesmente exclusiva, ou é Pessoa ou é Profissão.

O que acontece se considerar a classe Professor como do tipo Pessoa e incluir na classe Professor atributos que deveriam estar na classe do tipo Profissão?

Minha avaliação é que ocorreria no mínimo um acumulo de responsabilidade.

Isto não significa que o programa não vai fazer tudo o que precisa, mas sim que o código pode ser refatorado.

Ao meu ver, poderia criar uma classe Funcionario, que extende de Pessoa e possui um atributo do tipo Profissão.

Basicamente seria:

class Professor extends Profissao{

}

class Funcionario extends Pessoa{
    private Profissao professor = new Professor();
}

O que tenho em mente seria:

a) se classificar a classe o Professor como Profissão e depois inserir atributos inerentes à classe Pessoa, será ofertado dois sentidos à classe Professor -> Profissão e Pessoa (por ambiguidade “indireta”).

b) se classificar a classe Professor como Pessoa e tentar extender de Profissao, a ambiguidade é mais clara (“direta”).

Mas ai vai de cada um, pois taxonomia é um saco, ambiguidade é outro.

O motivo é conhecido: http://producao.virtual.ufpb.br/books/edusantana/introducao-a-programacao-livro/livro/capitulos/cap1-algoritmos.asc

A

@addller, meu ponto foi usar o cenário dado pra exemplificar o uso do polimorfismo.

Nao tenho nada contra seu ponto de que essa nao é a correta modelagem, só quis me ater ao problema da pergunta.

A

Não me compreenda mal, não há intensão de estar certo ou não, mas apenas de expor um comentário para que você e outros participantes, possam apontar erros ou sugestões de melhoria.

Foi por meio de discussões como estas que tomei conhecimento desse palavrão (taxonomia) e é por isso que a maior parte dos erros que tive e tenho advém da complexidade envolvida nessa análise.

Grato por compreender.

S

Nada é convertido, e nenhum dado é perdido.

Se você tem uma lista de Pessoa, mas sabe que o objeto que você está referenciando é um Aluno, então você faz um cast para Aluno, de forma a “enxergar” os membros específicos de Aluno. O mesmo vale para Professor.

Criado 24 de outubro de 2017
Ultima resposta 25 de out. de 2017
Respostas 6
Participantes 4