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
functipo2 String nome, String cpf, double comissao[/code]
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]
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.
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).
[quote=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).[/quote]
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.
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
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.
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. [/quote]
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