Preview only show first 10 pages with watermark. For full document please download

Gestão Academica Em Java - Aula7 - Pratica-polimorfismo

Objetivos: 1. Modelar um sistema orientado a objetos simples a partir de uma situação problema (domínio do problema). 2. Exercitar a extração e reconhecimento de objetos existentes no mundo real, seus atributos e seus métodos, propondo uma solução para o problema. 3. Usar o ambiente BlueJ para implementar a solução. Situação problema: 1. Domínio do problema: Gestão acadêmica 2. Descrição do problema: Uma universidade necessita de um sistema que facilite a sua gestão acadêmica. Deseja-se um controle de quais disciplinas...

   EMBED


Share

Transcript

Prática – Polimorfismo Objetivos:  Praticar o uso do polimorfismo.  Entender as vantagens de criar código genérico programando-se para uma abstração e não para classes concretas. Vamos introduzir o polimorfismo em nosso sistema de gestão acadêmica. O objetivo é escrever um código genérico para cálculo da folha de pagamento, somando-se o salário de todos os funcionários, independente do seu tipo. Para isto, tornamos nossa classe Funcionário uma abstração, contendo o método calcSalario() abstrato. ISTO JÁ FOI FEITO. Feito isto, implementa-se o método calcSalario() específico em cada uma das classes concretas (Professor e TecnicoAdministrativo). ISTO JÁ FOI FEITO. Agora, vamos criar a classe FolhaPagamento() que vai encapsular os métodos para os cálculos desejados. import java.util.ArrayList; public abstract class FolhaPagamento{ private static double totalFolha = 0; public static void somaFolha(ArrayList funcionarios) { for ( Funcionario func : funcionarios){ totalFolha += func.calcSalario(); System.out.printf("\n Nome: %s \n Salario: %1.2f \n Categoria:%s \n", func.getNome(), func.getSalario(), func.getClass().getName()); } } public static double getTotalFolha(){ return totalFolha; } public static double getTotalEncargos(){ //Suponha que o total de encargos //é 33,78% sobre o //sálário de cada funcionário. return (totalFolha * 0.3378); } } O método somaFolha varre o ArrayList e acumula o salário de cada funcionário no atributo totalFolha. Além disto, o método mostra o nome, salário e categoria de cada funcionário. Note que o método somaFolha recebe um ArrayList de qualquer tipo que estenda o tipo Funcionário. Isto é ArrayList. Isto permite que nosso método somaFolha possa receber o array de professores, de técnicos ou de qualquer outracategoria funcional que venha a ser criada. Isto possibilita a construção de código genérico, já que usa polimorfismo na abstração “Funcionário”. Este código jamais necessitará de manutenção, mesmo que novos subtipos sejam criados. Note que não temos na classe Funcionario, e nem em suas subclasses, o atributo categoria. Então pegados o nome da classe a qual o objeto pertence, através dos métodos getClass() e getName(). O getClass() retorna a classe a qual o objeto pertence e o getName retorna o nome da classe. Então o código: func.getClass().getName() retorna o nome da classe a qual o objeto func pertence. Isto permite facilmente saber o tipo do funcionário em um código genérico como este, que aceita qualquer subtipo de Funcionario. Em seguida crie uma opção no menu principal para realizar a soma dos salários dos Professores e Técnicos Administrativos na folha de pagamento. Agora, crie a opção que calcula a folha de pagamento. Esta opção deve executar o seguinte código: FolhaPagamento.somaFolha(professores); FolhaPagamento.somaFolha(tecnicos); System.out.printf("\n O total da folha de pagamento e': %1.2f \n",FolhaPagamento.getTotalFolha()); System.out.printf("O total de encargos e': %1.2f \n\n",FolhaPagamento.getTotalEncargos()); A classe FolhaPagamento é abstrata, e portanto, não pode ser instanciada. Seus métodos são estáticos, possibilitando que sejam chamados a partir da própria classe e não de uma instância. Para que isto fosse possível, é necessário que o atributo totalFolha, responsável por acumular o valor, seja estático também. Para experimentar o quanto a extensão do sistema se torna simplificada, crie um novo tipo de funcionário (de sua preferência), e acrescente-o na folha de pagamento. Agora, crie um método polimórfico que possa receber um objeto funcionário e calcular o Imposto de Renda Retido na Fonte (IRRF) a ser pago por ele, dentro da classe FolhaPagamento. Para isto, consideramos o parâmetro de entrada do método como sendo um objeto da classe Funcionario. Neste caso, em decorrência do polimorfismo, este parâmetro aceitará objetos de qualquer sub-classe da classe Funcionario: public static double calcIRRF(Funcionario f){ if (f.calcSalario() > 3000) return f.calcSalario()*0.275; else if (f.calcSalario() > 1500) return f.calcSalario()*0.15; else return 0; } Note que independentemente do sub-tipo de funcionário que for passado, f se comporta de forma diferente, e o método calcSalario() correto é chamado em tempo de execução, já que apenas durante a execução do método o sub-tipo específico da classe Funcionario será detectado. Agora, crie agora um método calcINSS(...) que receba como parâmetro um sub-tipo da classe Funcionario e calcule o valor da contribuição referente ao INSS a ser descontado do funcionário, que deve ser de 11% sob o seu salário. Para finalizar, crie na classe FolhaPagamento um método para gerar um relatório de folha de pagamento. Este método deve receber um arraylist de qualquer coisa que estenda Funcionário, e mostrar, para cada elemento: – os dados do funcionário; – o salário bruto do funcionário, gerado pelo método calcSalario(); – o IRRF a ser pago pelo funcionário; – o INSS a ser pago pelo funcionário; – e o salário líquido do funcionário, que é o resultado do salário bruto, descontando o IRRF e o INSS