Programação Orientada a Objetos
em Java
Carlos Andrés Ferrero
Herança
Material adaptado do curso de Desenvolvimento de Software em Java elaborado pelo Prof. Marcos André Pisching.
Problema
• O Banco, foco da implementação das últimas aulas, começa a oferecer, além de contas bancárias, serviços que podem ser contratados individualmente pelos
clientes;
• Quando um serviço é contratado, o sistema do banco deve registrar quem foi o cliente que contratou o
serviço, quem foi o funcionário responsável pelo atendimento ao cliente e a data de contratação.
Problema
3
• Princípio DRY – Don’t repeat yourself:
– Encontra motivação no aumento da produtividade e diminuição do custo de manutenção;
– A ideia consiste em reaproveitar o máximo de código já criado;
– Devemos procurar minimizar á utilização do “copiar e colar”.
Problema
4
• Assim poderíamos criar uma classe para todos os
Serviços prestados pelo Banco:
Problema
5
• Suponhamos:
– Serviço Empréstimo:
• Quando o cliente contrata o serviço são definidos o valor e a taxa de juros mensal do empréstimo;
• Assim devemos acrescentar dois novos atributos à classe Serviço: valor e taxa de juros.
Problema
6
• Suponhamos:
– Serviço do Veículo:
• Nesse serviço temos que definir informações do veículo segurado, valor do seguro e valor da franquia.
Problema
7
• Apesar de estarmos aparentemente dentro dos
conceitos da DRY, utilizar uma classe apenas
dificulta muito o desenvolvimento.
– No caso de haverem dois desenvolvedores trabalho nos serviços do Banco. Ambos iriam trabalhar encima do mesmo arquivo de código fonte? Obviamente, não.
• Além disso, quando chegarem novos
programadores na empresa ficariam um tanto
confusos em compreender todo o código da
classe Serviço.
Problema
8
• O fato da classe Serviço apresentar atributos para
todos os empréstimos:
– é um problema de semântica em relação à responsabilidade de classe serviço;
– e cada serviço específico, na prática, teria que ser instanciado como um objeto da classe Serviço,
causando desperdício de memória por deixar de
utilizar os atributos que não tem a ver com o serviço específico em questão.
Solução
9
• Criamos uma classe para cada serviço!
– Assim evitamos a ter uma grande quantidade de atributos e métodos desnecessários.
Solução
10
• Criamos uma classe para cada serviço!
Solução
11
• Importante:
– Criar uma classe para cada serviço torna o sistema mais flexível, pois qualquer alteração em um
determinado serviço não causará efeitos colaterais nos outros.
– Por outro lado, essas classes teriam bastante código repetido, contrariando a ideia do DRY.
– Além disso, qualquer alteração que deva ser realizada em todos os serviços, que seja comum a vários
serviços, precisa ser implementada em cada uma das classes.
Solução
12
• Neste problema podemos aplicar o conceito de
Herança:
– A ideia consiste em reutilizar o código implementado em uma classe, também em outras classes
relacionadas.
• Assim, podemos criar a classe Serviço com os
atributos e métodos que todos os serviços (seja
empréstimo ou seguro de veículo) e criar uma
classe para cada serviço Empréstimo e Seguro de
Veículo.
Solução
13
• Herança:
– As classes especializadas (específicas ) seriam “ligadas” de alguma forma à classe Serviço para reaproveitar o código nela definido.
– Esse relacionamento entre as classes é representado em UML pelo diagrama apresentado no próximo slide.
Solução
14
Solução
15
• Herança:
– A classe genérica deve conter atributos e métodos comuns as classes especializadas.
– As classes especializadas devem conter atributos e métodos que não dizem respeito a outras classes, apenas a ela.
Solução
16
Solução
17
• Implementação da classe especializada
SeguroVeiculo:
Solução
18
• Implementação da classe especializada
Emprestimo:
Solução
19
• Definições
– A classe genérica é denominada super classe, classe base ou classe mãe.
– As classes específicas são denominadas sub classes, classes derivadas ou classes filhas.
– Quando o operador new é aplicado em uma sub classe, o objeto construído possuirá os atributos e métodos definidos na sub classe e na super classe.
Solução
20
• Criação do objeto da subclasse:
– Ao executarmos new Emprestimo(), criamos
juntamente um objeto da classe Servico que estará integrado com o objeto Empréstimo de forma
Solução
21
• Podemos determinar um valor para a taxa de
serviço por meio de um método:
Solução
22
Solução
23
• Especificando um método criado implementado
em uma classe superior: seguro veicular + 10%.
Complemento
24
• Para não errarmos na hora de reimplementar métodos em subclasses, podemos utilizar a anotação @Override, com a qual é exigido que a reimplementação do método possua uma implementação do mesmo em alguma
Mágica
25
• Se quisermos criar uma série de serviços (indpenden-temente de natureza deles) o sistema saberá distinguir as respectivas taxas de serviço a serem cobradas? é fácil?
Mágica
26
Mágica
27
Conceito
28
• A capacidade dos objetos executarem seus
próprios métodos quando invocados como
métodos de objetos de classes superiores é
denominado de POLIMORFISMO.
• Por exemplo, criar um ArrayList de serviços e
colocar no lugar de serviços, empréstimos ou
seguro veiculo, e após referir-se ao método de
calcular taxa, sem saber especificamente a qual
método exatamente nos referimos.
Tarefa de Aula/Casa
29
1. No menu principal de banco devemos adicionar
a opção de contratar serviços;
• No menu serviços devemos disponibilizar a
opção de contratar serviço de empréstimo e de
seguro de veículo.
• Escolhendo a opção desejada deverá se
proceder as informações do de cada serviço.
OBS: para a classe veículo colocar os atributos
Tarefa de Aula/Casa
30