1. Programação
Orientada a Objetos
Unidade V – Elementos Avançados
de Orientação a Objetos com Java
(Parte I)
Prof. Nécio de Lima Veras
http://lattes.cnpq.br/8284657916723590
2. Objetivo
Reconhecer o conceito de estruturas
abstratas de programação e suas
funcionalidades aplicando-as com a
linguagem Java.
Prof. Nécio de Lima Veras
http://lattes.cnpq.br/8284657916723590
3. Royalties
Estes slides foram gentilmente cedidos pelo prof.
Régis Pires (IFPI-Parnaíba) com algumas
adaptações do prof. Nécio de Lima Veras (IFPI-
Parnaíba).
Prof. Nécio Veras
4. Classes Abstratas
– Usamos a palavra chave abstract para impedir
a instanciação de uma classe.
– Classes abstratas normalmente possuem um ou
mais métodos abstratos.
– Um método abstrato não possui corpo, apenas
define a assinatura (protótipo) do método
– Classes abstratas são úteis quando uma classe
define métodos a serem implementados apenas
pelas suas subclasses
Prof. Nécio Veras
6. Classes Abstratas
● Regras sobre métodos abstratos e as classes que os
contêm:
– Toda classe que possui métodos abstratos é
automaticamente abstrata e deve ser declarada como tal.
– Uma classe pode ser declarada abstrata mesmo se ela não
possuir métodos abstratos.
– Uma classe abstrata não pode ser instanciada.
– Uma subclasse de uma classe abstrata pode ser
instanciada se:
● Sobrescreve cada um dos métodos abstratos de sua superclasse
● Fornece uma implementação para cada um deles
Prof. Nécio Veras
7. Classes Abstratas
– Se uma subclasse de uma classe abstrata não
implementa todos os métodos abstratos que ela
herda, então a subclasse também é abstrata
– Para declarar um método abstrato coloque a
palavra-chave abstract no início do protótipo do
método
– Para declarar uma classe abstrata coloque a
palavra-chave abstract no início da definição da
classe
Prof. Nécio Veras
8. Classes Abstratas
abstract class Conta {
protected double saldo;
public void retira(double valor) {
this.saldo -= valor;
}
public void deposita(double valor) {
this.saldo += valor;
}
public double getSaldo() {
return this.saldo;
}
public abstract void atualiza();
} Prof. Nécio Veras
9. Interfaces
● Problema
– Suponha que você define as classes abstratas Forma
e Desenhavel e a classe Circulo (que estende
Forma)
– Como criar a classe CirculoDesenhavel que é ao
mesmo tempo Circulo e Desenhavel?
public class CirculoDesenhavel
extends Circulo, Desenhavel { ... }
– Mas... o código acima está ERRADO!
● Java, diferentemente de C++, não permite que uma classe
possua duas superclasses diretas, ou seja, não suporta
herança múltipla! Prof. Nécio Veras
10. Interfaces
● Solução
– Para resolver esse tipo de problema Java define o conceito
de interfaces
● Uma interface é semelhante a uma classe abstrata, exceto pelo
fato de utilizar a palavra chave interface no lugar de abstract
class na definição da classe.
– Interface é um contrato onde quem assina se
responsabiliza por implementar os métodos definidos
na interface (cumprir o contrato).
– Ela só expõe o que o objeto deve fazer, e não como ele
faz, nem o que ele tem. Como ele faz vai ser definido em
uma implementação dessa interface.
Prof. Nécio Veras
11. Interfaces
● Quais as diferenças entre interface e classe
abstrata?
– Declaração de métodos
● Em uma classe abstrata podem ser definidos métodos
abstratos e não-abstratos
● Todos os métodos de uma interface são implicitamente
abstratos (NÃO precisam ser declarados como tal)
– Declaração de variáveis
● Em uma classe abstrata podem ser definidas variáveis de
instância, de classe e constantes
● Todos os atributos de uma interface são sempre public
static final (constantes), mesmo que essas palavras
reservadas não sejam usadas.
Prof. Nécio Veras
13. Interfaces
interface Autenticavel {
boolean autentica(int senha);
}
class Gerente extends Funcionario
implements Autenticavel {
private int senha;
// outros atributos e métodos
public boolean autentica(int senha) {
if (this.senha != senha) {
return false;
}
// pode fazer outras possiveis verificacoes,
// como saber se esse departamento do
// gerente tem acesso ao Sistema
return true;
}
} Prof. Nécio Veras
14. Herança entre Interfaces
– Diferentemente das classes, uma interface pode
herdar de mais de uma interface.
– É como um contrato que depende de que outros
contratos sejam fechados antes deste valer.
– Você não herda métodos e atributos, e sim
responsabilidades.
Prof. Nécio Veras
15. Para que usar interfaces?
– Para deixar o código mais flexível, e
possibilitar a mudança de implementação
sem maiores traumas.
– Elas também trazem vantagens em não
acoplar as classes.
● Uma vez que herança através de classes
traz muito acoplamento, muitos autores
clássicos dizem que em muitos casos
herança quebra o encapsulamento.
Prof. Nécio Veras
17. Regras de Ouro
● No livro Design Patterns, logo no início os
autores citam 2 regras “de ouro”:
– “Evite herança, prefira composição”.
– “Programe voltado a interface e não a
implementação”.
Prof. Nécio Veras
18. Um exemplo destas regras:
Q u e r e m o s m o d e la r e s ta s m e s a s
e m te r m o s d e o b je to s
1 2
I s to é u m a m e s a
I s to é u m a m e s a !
c o m r o d in h a s !
3
A a p lic a ç ã o p o d e , e m a lg u m
I s to é u m a m e s a m o m e n to , u s a r a m e s a p u r a ,
d e p in g p o n g e m o u tr o , c o m r o d in h a s , e m o u tr o ,
c o m r o d in h a s ! c o m r e d e d e p in g p o n g , e tc .
Prof. Nécio Veras
19. Problema: Como resolver?
● Usando herança?
– Solução mais “natural”;
– Adição estática de responsablidades;
– Cliente não tem como controlar como e quando colocar
rodinhas, a rede de ping-pong ou outras coisas:
– Responsabilidade é atribuída a classe e
não a cada objeto
– Não é facilmente extensível;
– E se quisermos usar a mesa para jantar?
Prof. Nécio Veras
20. Um ótima solução
● Por que não decorar?
– Embelezar a mesa com objeto que adiciona rodinhas,
outro objeto que adiciona rede de ping-pong, etc;
– Cada objeto que “embeleza” a mesa é um decorator
(Design Patterns);
– Isto é, Composição de objetos!
Prof. Nécio Veras