Programação Orientada a Programação Orientada a Objetos: ReusoObjetos: Reuso
Alexandre César Muniz de Oliveira
2
Introduçã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
3
Introdução
Boolean
Character
Class
ClassLoader
Compiler
Math
Number
Process
Runtime
SecurityManager
Object Double
Float
Integer
Long
Croneable
Legenda:
CLASSE
CLASSE ABSTRATA
INTERFACE
extends
implements
4
Classes 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)
5
Classes 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
6
Classes 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
7
Classes 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)
8
Classes Abstrataspublic 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();}}
9
Exercícios
public abstract class Empregado {
private String nome, sobrenome;
public Empregado(String n, String s) {
nome= n; sobrenome=s;
}
public String getNome() {
return nome;
}
public abstract double calcSalario();}
10
Exercí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;
}}
11
Exercícios
12
Exercíciospublic 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;}}
13
Exercícios
public class Conta extends ContaAbstrata {
public Conta(String numero) {
super (numero);
}
public void sacar(double valor) {
this.Saldo(Saldo() - valor);
}
}
14
Exercícios
public class Poupanca extends Conta {public Poupanca(String numero) {
super (numero);}public void renderJuros(double taxa) {
depositar( Saldo()*taxa);}
}
15
Exercí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);
}}
16
Exercí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);
}}
17
Exercí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());
}}
18
Interfaces
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
19
Interfaces
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
20
Interfaces
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
21
Interfaces
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
22
Interfaces
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.
23
Interfaces
24
Interfaces
interface Leitor {String lendo();
}interface Programador {
void pensando(char[] ideias);String digitando();
}
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 classeprivate String aprendendo() {
return "Java";}
}
25
Exercí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; }
}
26
Exercí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; }
}
27
Exercí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));
}
}
28
Exercíciospublic 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 >= valor){ saldo -= valor; return true; }return false;
}public String toString (){ return "" + numero + "-" + saldo; }}}
29
Exercíciospublic 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());
}}
30
Reuso de código
Boolean
Character
Class
ClassLoader
Compiler
Math
Number
Process
Runtime
SecurityManager
Object Double
Float
Integer
Long
Croneable
Legenda:
CLASSE
CLASSE ABSTRATA
INTERFACE
extends
implements
31
Reuso de código
ThreadGroup
ThreadDeath
System
StringBuffer
String
Throwable
Object
Runnable
Legenda:
CLASSE
CLASSE ABSTRATA
INTERFACE
extends
implements
Errorjava.lang-erros
Exceptionjava.lang-exceptions
Thread
32
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."; }}
Reuso de código
Reuso da classe Exception
33
Reuso de código
class pilha{ // Pilha genérica int tam,topo;Object []vetor; // Vetor de elementos genéricos
pilha(int tam){ // Construtor this.tam=tam; topo=-1; vetor=new Object[tam];}
34
Reuso de códigopublic void insere(Object elemento){ // Insere um elemento na pilha
if(topo<(tam-1)){ // Verifica se pilha não está cheia topo++; vetor[topo]=elemento;}
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 elemento=vetor[topo]; topo--; return(elemento);}else{ System.out.println(“Pilha vazia!”); return(null);}}}
35
Reuso de código
class exemplo{public static void main(String args[]){ pilha p=new 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 i=1;i<=p.tam;i++)
System.out.println(p.remove()); }
}
36
Reuso 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
37
Reuso 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
38
Reuso de código
39
Reuso 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);
40
Herança múltipla
Simulador
41
Herança múltipla
Simulador
42
Herança múltipla
Simulador com visualização separada da atuação
43
Heranç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. * @param currentField O estado atual do campo. * @param location A posição do ator no campo. * @param updatedField O estado atualizado do campo. */ void act(Field currentField, Location location, Field updatedField);}
44
Herança múltipla
public class Fox extends Animal implements Drawable{ ...}
public class Hunter implements Actor, Drawable{ ...}
Projeto Livraria Projeto Livraria Virtual LeiaBemVirtual LeiaBem
......