A maior rede de estudos do Brasil

Grátis
220 pág.
Java -OO

Pré-visualização | Página 20 de 38

());
34 System.out.println("Salário: " + s.getSalario ());
35 System.out.println("Ramal: " + s.getRamal ());
36 System.out.println("Bonificação: " + s.calculaBonificacao ());
37 }
38 }
Código Java 8.26: TestaFuncionarios.java
7 Suponha que os gerentes recebam uma bonificação maior que os outros funcionários. Reescreva
o método calculaBonificacao() na classe Gerente. Depois, compile e execute o teste novamente.
1 class Gerente extends Funcionario {
2 private String usuario;
3 private String senha;
4
5 public double calculaBonificacao () {
6 return this.getSalario () * 0.6 + 100;
7 }
8
9 // GETTERS AND SETTERS
10 }
Código Java 8.27: Gerente.java
Exercícios Complementares
92 www.k19.com.br
93 HERANÇA
1 Defina na classe Funcionario um método para imprimir na tela o nome, salário e bonificação
dos funcionários.
2 Reescreva o método que imprime os dados dos funcionários nas classes Gerente, Telefonista
e Secretaria para acrescentar a impressão dos dados específicos de cada tipo de funcionário.
3 Modifique a classe TestaFuncionarios para utilizar o método mostraDados().
www.facebook.com/k19treinamentos 93
HERANÇA 94
94 www.k19.com.br
POLIMORFISMO
C
A
P
Í
T
U
L
O
9
Controle de Ponto
O sistema do banco deve possuir um controle de ponto para registrar a entrada e saída dos fun-
cionários. O pagamento dos funcionários depende dessas informações. Podemos definir uma classe
para implementar o funcionamento de um relógio de ponto.
1 class ControleDePonto {
2
3 public void registraEntrada(Gerente g) {
4 SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
5 Date agora = new Date();
6
7 System.out.println("ENTRADA: " + g.getCodigo ());
8 System.out.println("DATA: " + sdf.format(agora));
9 }
10
11 public void registraSaida(Gerente g) {
12 SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
13 Date agora = new Date();
14
15 System.out.println("SAÍDA: " + g.getCodigo ());
16 System.out.println("DATA: " + sdf.format(agora));
17 }
18 }
Código Java 9.1: ControleDePonto.java
A classe acima possui dois métodos: o primeiro para registrar a entrada e o segundo para registrar
a saída dos gerentes do banco. Contudo, esses dois métodos não são aplicáveis aos outros tipos de
funcionários.
Seguindo essa abordagem, a classe ControleDePonto precisaria de um par de métodos para cada
cargo. Então, a quantidade de métodos dessa classe seria igual a quantidade de cargos multipli-
cada por dois. Imagine que no banco exista 30 cargos distintos. Teríamos 60 métodos na classe
ControleDePonto.
Os procedimentos de registro de entrada e saída são idênticos para todos os funcionários. Con-
sequentemente, qualquer alteração na lógica desses procedimentos implicaria na modificação de
todos os métodos da classe ControleDePonto.
Além disso, se o banco definir um novo tipo de funcionário, dois novos métodos praticamente
idênticos aos que já existem teriam de ser adicionados na classe ControleDePonto. Analogamente,
se um cargo deixar de existir, os dois métodos correspondentes da classe ControleDePonto deverão
ser retirados.
www.facebook.com/k19treinamentos 95
POLIMORFISMO 96
GERENTES
SECRETÁRIASTELEFONISTAS
TELEFONISTAS SECRETÁRIAS
GERENTES
Figura 9.1: Métodos específicos
Modelagem dos funcionários
Com o intuito inicial de reutilizar código, podemos modelar os diversos tipos de funcionários do
banco utilizando o conceito de herança.
1 class Funcionario {
2 private int codigo;
3
4 // GETTERS AND SETTERS
5 }
Código Java 9.2: Funcionario.java
1 class Gerente extends Funcionario {
2 private String usuario;
3 private String senha;
4
5 // GETTERS AND SETTERS
6 }
Código Java 9.3: Gerente.java
1 class Telefonista extends Funcionario {
2 private int ramal;
3
4 // GETTERS AND SETTERS
5 }
Código Java 9.4: Telefonista.java
96 www.k19.com.br
97 POLIMORFISMO
É UM (extends)
Além de gerar reaproveitamento de código, a utilização de herança permite que objetos criados
a partir das classes específicas sejam tratados como objetos da classe genérica.
Em outras palavras, a herança entre as classes que modelam os funcionários permite que ob-
jetos criados a partir das classes Gerente ou Telefonista sejam tratados como objetos da classe
Funcionario.
No código da classe Gerente utilizamos a palavra extends. Ela pode ser interpretada como a
expressão: É UM ou É UMA.
1 class Gerente extends Funcionario
2 // TODO Gerente É UM Funcionario
Código Java 9.5: Gerente.java
Como está explícito no código que todo gerente é um funcionário então podemos criar um objeto
da classe Gerente e tratá-lo como um objeto da classe Funcionario também.
1 // Criando um objeto da classe Gerente
2 Gerente g = new Gerente ();
3
4 // Tratando um gerente como um objeto da classe Funcionario
5 Funcionario f = g;
Código Java 9.6: Generalizando
Em alguns lugares do sistema do banco será mais vantajoso tratar um objeto da classe Gerente
como um objeto da classe Funcionario.
Melhorando o controle de ponto
O registro da entrada ou saída não depende do cargo do funcionário. Não faz sentido criar um
método que registre a entrada para cada tipo de funcionário, pois eles serão sempre idênticos. Ana-
logamente, não faz sentido criar um método que registre a saída para cada tipo de funcionário.
Dado que podemos tratar os objetos das classes derivadas de Funcionario como sendo objetos
dessa classe, podemos implementar um método que seja capaz de registrar a entrada de qualquer
funcionário independentemente do cargo. Analogamente, podemos fazer o mesmo para o procedi-
mento de saída.
1 class ControleDePonto {
2
3 public void registraEntrada(Funcionario f) {
4 SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
5 Date agora = new Date();
6
7 System.out.println("ENTRADA: " + f.getCodigo ());
8 System.out.println("DATA: " + sdf.format(agora));
9 }
10
11 public void registraSaida(Funcionario f) {
www.facebook.com/k19treinamentos 97
POLIMORFISMO 98
12 SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
13 Date agora = new Date();
14
15 System.out.println("SAÍDA: " + f.getCodigo ());
16 System.out.println("DATA: " + sdf.format(agora));
17 }
18 }
Código Java 9.7: ControleDePonto.java
Os métodos registraEntrada() e registraSaida() recebem referências de objetos da classe
Funcionario como parâmetro. Consequentemente, podem receber referências de objetos de qual-
quer classe que deriva direta ou indiretamente da classe Funcionario.
A capacidade de tratar objetos criados a partir das classes específicas como objetos de uma classe
genérica é chamada de polimorfismo.
Aplicando a ideia do polimorfismo no controle de ponto, facilitamos a manutenção da classe
ControleDePonto. Qualquer alteração no procedimento de entrada ou saída implica em alterações
em métodos únicos.
Além disso, novos tipos de funcionários podem ser definidos sem a necessidade de qualquer al-
teração na classe ControleDePonto. Analogamente, se algum cargo deixar de existir, nada precisará
ser modificado na classe ControleDePonto.
FUNCIONÁRIOS
TELEFONISTAS SECRETÁRIASGERENTES
FUNCIONÁRIOS
Figura 9.2: Método genérico
Exercícios de Fixação
1 Crie um projeto no Eclipse chamado Polimorfismo.
2 Defina uma classe genérica para modelar as contas do banco.
1 public class Conta {
2 private double saldo;
3
4 // GETTERS AND SETTERS
5 }
Código Java 9.8: Conta.java
98 www.k19.com.br
99 POLIMORFISMO
3 Defina duas classes específicas para dois tipos de contas do banco: poupança e corrente.
1 public class ContaPoupanca extends Conta {
2 private int diaDoAniversario;
3
4 // GETTERS AND SETTERS
5 }
Código Java 9.9: ContaPoupanca.java
1 class ContaCorrente extends Conta {
2 private double limite;
3
4 // GETTERS AND SETTERS
5 }
Código