Programação Orientada a
Objetos: Reuso
Alexandre César Muniz de Oliveira
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
2
Introdução
Boolean
Character
Croneable
Class
ClassLoader
Compiler
Object
Math
Double
Float
Legenda:
Number
CLASSE
Integer
CLASSE ABSTRATA
Process
INTERFACE
Runtime
Long
extends
SecurityManager
implements
3
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)
4
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
5
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
6
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)
7
Classes 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();
}}
8
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();}
9
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;
}}
10
Exercícios
11
Exercí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;
}}
12
Exercícios
public class Conta extends ContaAbstrata {
public Conta(String numero) {
super (numero);
}
public void sacar(double valor) {
this.Saldo(Saldo() - valor);
}
}
13
Exercícios
public class Poupanca extends Conta {
public Poupanca(String numero) {
super (numero);
}
public void renderJuros(double taxa) {
depositar( Saldo()*taxa);
}
}
14
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);
}
}
15
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);
}
}
16
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());
}
}
17
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
18
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
19
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
20
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
21
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.
22
Interfaces
23
Interfaces
class ParticipanteForum implements Leitor, Programador
interface Leitor {
{
String lendo();
String pensamento;
}
public String lendo() { return "Forum"; }
interface Programador {
public void pensando(char[] ideias) {
void pensando(char[] ideias);
pensamento = new String(ideias);
String digitando();
}
}
public String digitando() {
return pensamento;
}
// método exclusivo desta classe
private String aprendendo() {
return "Java";
}
}
24
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; }
}
25
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; }
}
26
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));
}
}
27
Exercí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 >= valor){ saldo -= valor; return true; }
return false;
}
public String toString (){ return "" + numero + "-" + saldo; }
}
}
28
Exercí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());
}}
29
Reuso de código
Boolean
Character
Croneable
Class
ClassLoader
Compiler
Object
Math
Double
Float
Legenda:
Number
CLASSE
Integer
CLASSE ABSTRATA
Process
INTERFACE
Runtime
Long
extends
SecurityManager
implements
30
Reuso de código
ThreadGroup
Runnable
Thread
System
Object
StringBuffer
String
Legenda:
Throwable
CLASSE
CLASSE ABSTRATA
INTERFACE
extends
implements
Error
java.lang-erros
Exception
java.lang-exceptions
ThreadDeath
31
Reuso 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.";
}
32
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];
}
33
Reuso de código
public 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);
}}}
34
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());
}
}
35
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
36
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
37
Reuso de código
38
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);
39
Herança múltipla
Simulador
40
Herança múltipla
Simulador
41
Herança múltipla
Simulador com visualização separada da
atuação
42
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);
}
43
Herança múltipla
public class Fox extends Animal implements Drawable
{
...
}
public class Hunter implements Actor, Drawable
{
...
}
44
Projeto Livraria
Virtual LeiaBem
...