classes abstratas e interfaces
TRANSCRIPT
Prof. Nécio de Lima Verashttp://lattes.cnpq.br/8284657916723590
Programação Orientada a Objetos
Unidade V – Elementos Avançados de Orientação a Objetos com Java
(Parte I)
Prof. Nécio de Lima Verashttp://lattes.cnpq.br/8284657916723590
Objetivo
Reconhecer o conceito de estruturas abstratas de programação e suas funcionalidades aplicando-as com a linguagem Java.
Prof. Nécio Veras
RoyaltiesRoyalties
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
Classes AbstratasClasses 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
Classes AbstratasClasses Abstratas
Prof. Nécio Veras
Classes AbstratasClasses 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
Classes AbstratasClasses 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
Classes AbstratasClasses Abstratasabstract 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
InterfacesInterfaces
● 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
InterfacesInterfaces
● 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
InterfacesInterfaces
● 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
InterfacesInterfaces
Prof. Nécio Veras
InterfacesInterfacesinterface Autenticavel {
boolean autentica(int senha);}
class Gerente extends Funcionario implements Autenticavel {
private int senha;
// outros atributos e métodospublic 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
Herança entre InterfacesHeranç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
Para que usar interfaces?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
InterfacesInterfaces
Prof. Nécio Veras
Regras de OuroRegras 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
Um exemplo destas regras: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 se m te r m o s d e o b je to s
I s t o é u m a m e s a !
1
I s t o é u m a m e s a !I s t o é u m a m e s a !
1
I s t o é u m a m e s ac o m r o d in h a s !
2
I s t o é u m a m e s ac o m r o d in h a s !I s t o é u m a m e s ac o m r o d in h a s !
2
I s to é u m a m e s ad e p in g p o n g
c o m r o d in h a s !
3
I s to é u m a m e s ad e p in g p o n g
c o m r o d in h a s !
I s to é u m a m e s ad e p in g p o n g
c o m r o d in h a s !
3
A a p l i c a ç ã o p o d e , e m a l g u m m o m e n to , u s a r a m e s a p u r a ,e m o u t r o , c o m r o d i n h a s , e m o u t r o , c o m r e d e d e p i n g p o n g , e tc .
Prof. Nécio Veras
Problema: Como resolver?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
Um ótima soluçãoUm ó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
Diagrama da soluçãoDiagrama da solução
Prof. Nécio Veras
ExercícioExercício
● Implemente o seguinte o diagrama: