• Nenhum resultado encontrado

Construtores e Herança

No documento Orientação a Objetos em Java (páginas 109-116)

Quando temos uma hierarquia de classes, as chamadas dos construtores são mais complexas do que o normal. Pelo menos um construtor de cada classe de uma mesma sequência hierárquica deve ser chamado ao instanciar um objeto. Por exemplo, quando um objeto da classeEmprestimoé criado, pelo menos um construtor da própria classeEmprestimoe um da classeServicodevem ser executados. Além disso, os construtores das classes mais genéricas são chamados antes dos constru- tores das classes específicas.

1 class Servico { 2 // ATRIBUTOS

3

4 public Servico () {

5 System . out . println (" Servico ") ;

6 }

7 }

1 class Emprestimo extends Servico { 2 // ATRIBUTOS

3

4 public Emprestimo () {

5 System . out . println (" Emprestimo ") ;

6 }

7 }

Código Java 7.19: Emprestimo.java

Por padrão, todo construtor chama o construtor sem argumentos da classe mãe se não existir nenhuma chamada de construtor explícita.

Exercícios de Fixação

1 Para não confundir, feche o projetoEncapsulamento clicando com o botão direito do mouse sobre esse projeto e selecionando a opção “Close Project”. Em seguida, crie um novo projeto para os exercícios desse capítulo. Digite “CTRL + 3” e pesquise por “Create a Java project”. Selecione a opção correspondente e siga a imagem abaixo.

2 Defina uma classe chamadaFuncionario para modelar os funcionários de um banco. Sabendo que todo funcionário possui nome e salário, inclua os getters e setters dos atributos.

1 public class Funcionario { 2 private String nome ; 3 private double salario ; 4

5 // GETTERS AND SETTERS

6 }

Código Java 7.20: Funcionario.java

3 Crie uma classe para cada tipo específico de funcionário herdando da classeFuncionario. Con- sidere apenas três tipos específicos de funcionários: gerentes, telefonistas e secretarias. Os gerentes possuem um nome de usuário e uma senha para acessar o sistema do banco. As telefonistas possuem um código de estação de trabalho. As secretarias possuem um número de ramal.

1 public class Gerente extends Funcionario { 2 private String usuario ;

3 private String senha ; 4

5 // GETTERS AND SETTERS

6 }

Código Java 7.21: Gerente.java

1 public class Telefonista extends Funcionario { 2 private int estacaoDeTrabalho ;

3

4 // GETTERS AND SETTERS

5 }

Código Java 7.22: Telefonista

1 public class Secretaria extends Funcionario { 2 private int ramal ;

3

4 // GETTERS AND SETTERS

5 }

Código Java 7.23: Secretaria.java

4 Teste o funcionamento dos três tipos de funcionários criando um objeto de cada uma das classes:

Gerente,TelefonistaeSecretaria. 1 public class TestaFuncionarios {

2 public static void main ( String [] args ) { 3 Gerente g = new Gerente () ;

4 g . setNome (" Rafael Cosentino ") ; 5 g . setSalario (2000) ;

6 g . setUsuario (" rafael . cosentino ") ; 7 g . setSenha (" 12345 ") ;

8

9 Telefonista t = new Telefonista () ; 10 t . setNome (" Carolina Mello ") ; 11 t . setSalario (1000) ;

12 t . setEstacaoDeTrabalho (13) ; 13

14 Secretaria s = new Secretaria () ; 15 s . setNome (" Tatiane Andrade ") ; 16 s . setSalario (1500) ;

17 s . setRamal (198) ; 18

19 System . out . println (" GERENTE ") ;

20 System . out . println (" Nome : " + g . getNome () ) ; 21 System . out . println (" Salário : " + g . getSalario () ) ; 22 System . out . println (" Usuário : " + g . getUsuario () ) ; 23 System . out . println (" Senha : " + g . getSenha () ) ; 24

25 System . out . println (" TELEFONISTA ") ;

26 System . out . println (" Nome : " + t . getNome () ) ; 27 System . out . println (" Salário : " + t . getSalario () ) ;

28 System . out . println (" Estacao de trabalho : " + t . getEstacaoDeTrabalho () ) ; 29

30 System . out . println (" SECRETARIA ") ;

31 System . out . println (" Nome : " + s . getNome () ) ; 32 System . out . println (" Salário : " + s . getSalario () ) ; 33 System . out . println (" Ramal : " + s . getRamal () ) ; 34 }

35 }

Execute a classeTestaFuncionarios.

5 Suponha que todos os funcionários recebam uma bonificação de 10% do salário. Acrescente um

método na classeFuncionariopara calcular essa bonificação. 1 public class Funcionario {

2 private String nome ; 3 private double salario ; 4

5 public double calculaBonificacao () { 6 return this. salario * 0.1;

7 }

8

9 // GETTERS AND SETTERS

10 }

Código Java 7.25: Funcionario.java

6 Altere a classeTestaFuncionarios para exibir a bonificação de cada funcionário, além dos dados que já foram impressos. Depois, execute o teste novamente.

1 public class TestaFuncionarios {

2 public static void main ( String [] args ) { 3 Gerente g = new Gerente () ;

4 g . setNome (" Rafael Cosentino ") ; 5 g . setSalario (2000) ;

6 g . setUsuario (" rafael . cosentino ") ; 7 g . setSenha (" 12345 ") ;

8

9 Telefonista t = new Telefonista () ; 10 t . setNome (" Carolina Mello ") ; 11 t . setSalario (1000) ;

12 t . setEstacaoDeTrabalho (13) ; 13

14 Secretaria s = new Secretaria () ; 15 s . setNome (" Tatiane Andrade ") ; 16 s . setSalario (1500) ;

17 s . setRamal (198) ; 18

19 System . out . println (" GERENTE ") ;

20 System . out . println (" Nome : " + g . getNome () ) ; 21 System . out . println (" Salário : " + g . getSalario () ) ; 22 System . out . println (" Usuário : " + g . getUsuario () ) ; 23 System . out . println (" Senha : " + g . getSenha () ) ;

24 System . out . println (" Bonificação : " + g . calculaBonificacao () ) ; 25

26 System . out . println (" TELEFONISTA ") ;

27 System . out . println (" Nome : " + t . getNome () ) ; 28 System . out . println (" Salário : " + t . getSalario () ) ;

29 System . out . println (" Estacao de trabalho : " + t . getEstacaoDeTrabalho () ) ; 30 System . out . println (" Bonificação : " + t . calculaBonificacao () ) ;

31

32 System . out . println (" SECRETARIA ") ;

33 System . out . println (" Nome : " + s . getNome () ) ; 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 7.26: TestaFuncionarios.java

7 Suponha que os gerentes recebam uma bonificação maior que os outros funcionários. Reescreva

o métodocalculaBonificacao()na classeGerente. 1 public 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 7.27: Gerente.java

Execute a classeTestaFuncionariose veja os valores das bonificações.

Exercícios Complementares

1 Defina na classeFuncionarioum método chamadomostraDados para exibir no Console o nome, salário e bonificação dos funcionários.

2 Reescreva o métodomostraDadosnas classesGerente,TelefonistaeSecretariapara acres- centar os dados específicos de cada tipo de funcionário.

POLIMORFISMO

C

A P Í T U L O

8

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 8.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 classeControleDePontoprecisaria 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 classeControleDePonto.

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 classeControleDePonto. Analogamente, se um cargo deixar de existir, os dois métodos correspondentes da classeControleDePontodeverão ser retirados.

GERENTES

SECRETÁRIAS TELEFONISTAS

TELEFONISTAS SECRETÁRIAS

GERENTES

Figura 8.1: Métodos específicos

No documento Orientação a Objetos em Java (páginas 109-116)