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 ?
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 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.
@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
@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.
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.
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.
