Title: Programa
1Programação Orientada a Objetos Reuso
- Alexandre César Muniz de Oliveira
2Introdução
- Hierarquia de classes está associada a forma como
se distribui conceitos (comportamentos) entre as
unidades que compõem o sistema (classes) - O genérico reside em um nível superior enquanto
que o específico nos inferiores - O genérico pode ser atribuído ao específico
(truncado), mas o contrário não (inventado) - Descer a hierarquia retrata a diminuição do grau
de abstração
3Introdução
Boolean
Character
Croneable
Class
ClassLoader
Compiler
Double
Math
Object
Float
Legenda
Number
CLASSE CLASSE ABSTRATA INTERFACE extends imple
ments
Integer
Process
Long
Runtime
SecurityManager
4Classes Abstratas
- Servem de base para a construção de uma
hierarquia de classes - Representam o comportamento tão genérico quanto
possível (métodos genéricos) - Não admitem objetos concretos com seu
comportamento (abstrato)
5Classes Abstratas
- Não podem ser instanciadas
- Deixa a implementação mais específica de métodos
nas subclasses que não forem abstratas - Facilita o polimorfismo com métodos sobrepostos
- Herança de código preservando comportamento
6Classes Abstratas
- Define uma interface comum a todos em uma
hierarquia - Permite a implementação progressiva de classes
- Permite o acesso a
- Construtores
- Métodos public e protected
- É utilizada a palavra reservada abstract para sua
definição
7Classes Abstratas
- É obrigatório definir uma classe como abstrata se
houver um ou mais métodos abstratos - Métodos abstratos não apresentam implementação
- As subclasses de classes abstratas devem fornecer
implementações para todos os métodos abstratos (a
não ser que a subclasse também seja abstrata)
8Classes Abstratas
- public abstract class Mensagem
- private String remetente
- private int status
- public abstract void play()
- public abstract void testaItens()
- public abstract void aplicaItens()
- public abstract boolean noPadrao()
- public String getRemetente()
- return this.remetente
-
- public String Formata()
- this.testaItens()
- if (this.noPadrao())
- this.aplicaItens()
-
9Exercícios
- public abstract class Empregado
- private String nome, sobrenome
- public Empregado(String n, String s)
- nome n sobrenomes
-
- public String getNome()
- return nome
-
- public abstract double calcSalario()
10Exercícios
- public final class Gerente extends Empregado
- private double salario
- public Gerente(String n, String s)
- super(n, s)
- this.salario 1000.0
-
- public double calcSalario()
- return salario
-
11Exercícios
12Exercícios
- public abstract class ContaAbstrata
- private String numero
- private double saldo
- public ContaAbstrata(String numero)
- this.numero numero
- saldo 0.0
-
- public void depositar(double valor)
- saldo valor
-
- public abstract void sacar(double valor)
- protected void Saldo(double saldo)
- this.saldo saldo
-
- public double Saldo()
- return saldo
-
13Exercícios
- public class Conta extends ContaAbstrata
- public Conta(String numero)
- super (numero)
-
- public void sacar(double valor)
- this.Saldo(Saldo() - valor)
-
14Exercícios
- public class Poupanca extends Conta
- public Poupanca(String numero)
- super (numero)
-
- public void renderJuros(double taxa)
- depositar( Saldo()taxa)
-
15Exercícios
- public class ContaEspecial extends Conta
- public static final double TAXA 0.01
- private double bonus
- public ContaEspecial (String numero)
- super (numero)
-
- public void depositar(double valor)
- bonus bonus (valor TAXA)
- super.depositar(valor)
-
16Exercícios
- public class ContaImposto extends ContaAbstrata
- public static final double TAXA 0.001
- public ContaImposto (String numero)
- super (numero)
-
- public void sacar(double valor)
- double imposto valor TAXA
- double total valor imposto
- this.Saldo( Saldo() total)
-
17Exercícios
- public class Programa
- public static void main(String args)
- ContaAbstrata conta1, conta2
- conta1 new ContaEspecial(21.342-7)
- conta2 new ContaImposto(21.987-8)
- conta1.sacar(500)
- conta2.sacar(500)
- System.out.println(conta1. Saldo())
- System.out.println(conta2. Saldo())
-
18Interfaces
- Herança múltipla pode causar conflitos de métodos
iguais com implementações diferentes - Java não
suporta - Uma interface pode ser definida como um
protocolo que define o comportamento de um
determinado objeto - Funciona como uma superclasse onde todos os
métodos não estão implementados - Uma classe pode implementar vários serviços
(múltiplas interfaces) causando um efeito similar
à herança múltipla
19Interfaces
- Interfaces são também conhecidas como classes
abstratas puras - Não têm construtores
- Não contém atributos de dados (a não ser
constantes estáticas public, static, final) - Todos os métodos são implicitamente abstratos
- Provêm uma interface de serviços e comportamentos
- Uma classe pode estender somente uma única
classe, mas pode implementar várias interfaces
20Interfaces
- Implementar uma interface é semelhante à estender
uma classe, porém a classe não herda
comportamentos e sim os implementa - É possível chamar métodos que sejam membros da
interface em qualquer objeto que implemente a
interface
21Interfaces
- Exemplo um veículo pode acelerar, frear e virar
para uma direção - public interface Veiculo
- public freiar()
- public acelerar()
- public virar(direcao)
-
- As classes caminhão, trator, carroça, ..., que
implementam a interface veículo é que dizem como
efetuar estas operações em cada classe - Pode-se projetar sistemas e serviços utilizando
interfaces sem a preocupação com sua implementação
22Interfaces
- Provedora de serviços
- Forte separação entre funcionalidade e
implementação. - Embora parâmetros e tipos de retorno sejam
obrigatórios. - Clientes interagem independentemente da
implementação. - Mas os clientes podem escolher implementações
alternativas.
23Interfaces
24Interfaces
class ParticipanteForum implements Leitor,
Programador String pensamento public String
lendo() return "Forum" public void
pensando(char ideias) pensamento new
String(ideias) public String digitando()
return pensamento // método exclusivo
desta classe private String aprendendo()
return "Java"
- interface Leitor
- String lendo()
-
- interface Programador
- void pensando(char ideias)
- String digitando()
25Exercícios
- public interface Funcionario
- public double calcularSalario()
- public int bonus()
-
- class Gerente implements Funcionario
- private static final int SALARIO 40000
- private static final int BONUS 0
- public double calcularSalario()
- return SALARIO
-
- public int getBonus( ) return BONUS
26Exercícios
- class Programador implements Funcionario
- private static final double SALARIO 50000
- private static final int BONUS 10000
- public double calcularSalario()
- return SALARIO
-
- public int getBonus() return BONUS
27Exercícios
- public class FolhaPagamento
- public double calcularFolhaPagamento(Funcionario
emp) - return emp.calcularSalario() emp.bonus()
-
- public static void main(String arg)
- FolhaPagamento fp new FolhaPagamento()
- Programador prg new Programador()
- Gerente mgr new Gerente()
- System.out.println("Salário do Programador "
- fp.calcularFolhaPagamento(prg))
- System.out.println("Salário do Gerente "
- fp.calcularFolhaPagamento(mgr))
-
28Exercícios
- public interface Transacao
- public void depositar (double valor)
- public boolean sacar (double valor)
-
- public class Conta implements Transacao
- private double saldo
- private String numero
- public void depositar (double valor) saldo
valor - public boolean sacar (double valor)
- if (saldo gt valor) saldo - valor return
true - return false
-
- public String toString () return "" numero
"-" saldo -
29Exercícios
- public class TesteConta
- static void teste (Transacao t)
- t.depositar(500)
-
- public static void main(String args)
- Transacao t
- Conta c new Conta()
- c.nomeia("Acmo e mia")
- c.depositar(500)
- System.out.println(c.toString())
- c.sacar(200)
- System.out.println(c.toString())
- t c
- teste(t)
- System.out.println(((Conta) t).toString())
-
30Reuso de código
Boolean
Character
Croneable
Class
ClassLoader
Compiler
Double
Math
Object
Float
Legenda
Number
CLASSE CLASSE ABSTRATA INTERFACE extends imple
ments
Integer
Process
Long
Runtime
SecurityManager
31Reuso de código
ThreadGroup
Thread
Runnable
System
StringBuffer
Object
String
Legenda
Throwable
CLASSE CLASSE ABSTRATA INTERFACE extends imple
ments
ThreadDeath
Error java.lang-erros
Exception java.lang-exceptions
32Reuso de código
- Reuso da classe Exception
public class NoMatchingDetailsException extends
Exception private String key public
NoMatchingDetailsException(String key)
this.key key public String
getKey() return key
public String toString() return "No
details matching '" key "'
were found."
33Reuso de código
- class pilha // Pilha genérica
- int tam,
- topo
- Object vetor // Vetor de elementos
genéricos -
- pilha(int tam) // Construtor
- this.tamtam
- topo-1
- vetornew Objecttam
-
34Reuso de código
- public void insere(Object elemento) // Insere
um elemento na pilha - if(topolt(tam-1)) // Verifica se pilha não
está cheia - topo
- vetortopoelemento
-
- else System.out.println(Pilha cheia!)
-
- public Object retira() // Retira um elemento
da pilha - if(topo!-1) // Verifica se pilha não está
vazia - Object elementovetortopo
- topo--
- return(elemento)
-
- else
- System.out.println(Pilha vazia!)
- return(null)
-
35Reuso de código
- class exemplo
- public static void main(String args)
- pilha pnew pilha(5)
- p.insere(new String(Um elemento))
- p.insere(new Float(1.5))
- p.insere(new Integer(1))
- p.insere(new Character(a))
- p.insere(new pilha(10))
- p.remove()
- for(int i1iltp.tami)
- System.out.println(p.remove())
-
-
36Reuso de código
- Reuso do código que implementa uma pilha para
gerar uma classe fila - Fila.insere aproveita Pilha.insere
- Fila.remove Precisa ser reescrito usando outro
atributo chamado início que é incrementado quando
um elemento é removido - Fila.vazia Precisa ser reescrita
37Reuso de código
- Sem herança
- Modificador final
- Classe String é vital para a normal operação da
JVM - main (String args)
- Sempre se pode confiar no comportamento de uma
classe final
38Reuso de código
39Reuso de código
- public class Database
-
- public void addItem(Item theItem)
-
- ...
-
-
- Video video new Video(...)
- CD cd new CD(...)
- database.addItem(video)
- database.addItem(cd)
40Herança múltipla
41Herança múltipla
42Herança múltipla
- Simulador com visualização separada da atuação
43Herança múltipla
public interface Actor / Realiza
o comportamento diário do ator. Transfere
o ator para updatedField se ele for
participar das etapas posteriores da simulação.
_at_param currentField O estado atual do
campo. _at_param location A posição do ator
no campo. _at_param updatedField O estado
atualizado do campo. / void act(Field
currentField, Location location,
Field updatedField)
44Herança múltipla
public class Fox extends Animal implements
Drawable ...
public class Hunter implements Actor, Drawable
...
45Projeto Livraria Virtual LeiaBem...