Comparar objetos de subclasses distintas

8 respostas
L
Estou com a seguinte dificuldade tenho uma classe funcionario com duas subclasses functipo1 e functipo2. todos os funcionários são cadastrados em um ArrayList functipo1 e functipo2 possuem algumas variáveis distintas. Ex
functipo1 String nome, String cpf, double salario 
  
functipo2 String nome, String cpf, double comissao
eis o problema. gostaria de imprimir apenas os funcionarios da subclasse functipo2. estou tentando fazer uma condicional para imprimir se
if(funcionario.getClass()==functipo1.getClass())
mas nao esta dando certo tentei também um condição de que se comissão fosse null nao imprime
if((functipo2)funcionario).getComissao()!= null) {} else{}
mas retorna a mensagem

[color=red]
thread "main" java.lang.ClassCastException: funcionario.functipo1 cannot be cast to funcionario.functipo2
at funcionarios.Folhadepagamento.listaFuncionariosComissionados(Folhadepagamento.java:76)
at funcionarios.Main.main(Main.java:222)[/color]

como posso resolver esse problema obrigado!!!!

8 Respostas

nel

if (objeto.getClass().equals(FuncionarioTipo2.getClass())) { // faz algo }

Não resolve ?

drsmachado
if(funcionario instanceof FuncionarioTipo2){
//bla bla bla
}

Não resolve?
Aliás, cuidado com o instanceof. Se você comparar com uma classe que é superclasse da que forneceu o objeto, ele irá retornar true e executar o bloco dentro do if.

rmendes08

Para você testar a classe de um objeto basta utilizar o operador instanceof. Mas na minha opinião, isso deve ser usado somente para fazer um downcasting seguro, e nunca usar para implementar regras de negócio.

No seu caso, eu acho que a herança é desnecessária. É melhor fazer uma única classe Funcionario com os campos salario e comissao. Para saber se o funcionario tem comissão basta testar (comissao > 0.0).

drsmachado

rmendes08:
Para você testar a classe de um objeto basta utilizar o operador instanceof. Mas na minha opinião, isso deve ser usado somente para fazer um downcasting seguro, e nunca usar para implementar regras de negócio.

No seu caso, eu acho que a herança é desnecessária. É melhor fazer uma única classe Funcionario com os campos salario e comissao. Para saber se o funcionario tem comissão basta testar (comissao > 0.0).


Pelo que o autor do tópico colocou, ambos possuem os mesmos atributos, apenas o nome de um deles é que muda (de salário para comissão).
Sendo assim, eu não faria distinção, colocaria como nome do atributo “remuneração” e pronto.

L

O problema [color=darkblue]drsmachado[/color] e que não são iguais pois salario e fixo e comissão vem de outras variáveis como venda e porcentagem e bonus. e tambem nao tem como fazer na mesma classe funcionario pois esse foi apenas um exemplo mas existem outras diferenças e metodos diferentes construidos em cada classe inclusive outras subclasses.
utilizando o instaceof funcionou mais nao entendi [color=darkblue]rmendes08[/color] o porque de nao ser ideal este uso. porque este metodo de imprimir e apenas um dos que pretendia usar esta soloçao. tem outros tambem como ligar uma venda a um vendedor

E

Você pode criar uma hierarquia do tipo

Funcionario <- FuncionarioComissionado
Funcionario <- FuncionarioAssalariado

Outra forma, mais recomendável, é injetar o cálculo dessas coisas usando uma outra classe. Crie uma interface para o cálculo de salários, bônus etc. e crie duas classes que implementam essa interface: uma para comissionados e outra para assalariados. Crie uma instância de cada classe (pode ser singleton, dependendo do tipo de cálculo a ser feito).
Então, quando você instancia um Funcionario, pode atribuir uma instância dessa classe que faz o cálculo de salários.

L

entanglement:
Você pode criar uma hierarquia do tipo

Funcionario <- FuncionarioComissionado
Funcionario <- FuncionarioAssalariado

Outra forma, mais recomendável, é injetar o cálculo dessas coisas usando uma outra classe. Crie uma interface para o cálculo de salários, bônus etc. e crie duas classes que implementam essa interface: uma para comissionados e outra para assalariados. Crie uma instância de cada classe (pode ser singleton, dependendo do tipo de cálculo a ser feito).
Então, quando você instancia um Funcionario, pode atribuir uma instância dessa classe que faz o cálculo de salários.

tudo isso já foi feito e esta funcionando unica duvida que me surgiu agora e [color=darkblue]rmendes08[/color] falou que nao e um uso ideal para o instanceof

ViniGodoy

Por favor, ao postar tópicos, não deixe todas as letras do título MAIÚSCULAS.

Criado 8 de junho de 2012
Ultima resposta 8 de jun. de 2012
Respostas 8
Participantes 6