Orientação a Objetos – Interfaces

Propaganda
Orientação a Objetos – Interfaces
Material baseado na apostila FJ-11: Java e
Orientação a Objetos do curso Caelum,
Ensino e Inovação, disponível para download
em http://www.caelum.com.br/apostilas/
1
Objetivos
•
Dizer o que é uma interface e as diferenças entre
herança e implementação;
•
Escrever uma interface em Java;
•
Utilizá-las como um poderoso recurso para diminuir
acoplamento entre as classes.
2
A hierarquia de funcionários
•
Suponha que em nossa hierarquia de funcionários, Diretores e
Gerentes possuam senhas que dão acesso ao Sistema Interno do
Banco e que precisam ser validadas.
•
Suponha ainda que o procedimento de validação de um e outro tipo
de funcionário é ligeiramente diferente.
3
A hierarquia de funcionários
4
O sistema interno da empresa
•
O sistema interno da empresa precisa autenticar seus usuários a fim
de permitir ou não o acesso ao mesmo.
•
Por que o trecho de código acima não compila? O método autentica
não faz parte da interface da superclasse Funcionario.
•
Por que então não colocar o método abstrato autentica() na classe
Funcionario? Porque as classes Secretaria e Engenheiro teriam de
implementá-lo e isso pode não fazer sentido para essas classes.
5
A hierarquia de funcionários
•
Uma solução mais interessante seria acrescentar um
outro nível à hierarquia de classes.
6
O sistema interno
•
O sistema interno poderia agora ser escrito como:
7
Problema
•
Como dar acesso ao sistema também aos clientes da
empresa?
•
Primeira tentativa:
8
Login do Cliente
•
Seria essa uma boa solução?
Provavelmente não. Lembre-se, um cliente NÃO É UM
funcionário. Ao fazer a Cliente herdar de Funcionário,
obrigaremos a classe a implementar o método
getBonificacao(), o que não faz qualquer sentido para
clientes.
9
Pensando alto...
•
Qual é o nosso problema? Precisamos de uma maneira comum de
referenciar Gerentes, Diretores e Clientes de modo a poder usá-los
de forma polimórfica...
•
Mas essa “maneira” não pode ser uma superclasse da hierarquia de
Funcionários uma vez que um Cliente não é um Funcionário...
•
Será que funcionaria se eu criasse uma outra hierarquia paralela?
Autenticável por exemplo... Clientes pertenceriam a hierarquia
Autenticável e Gerentes e Diretores pertenceriam simultaneamente
às hierarquias Funcionario e Autenticavel. Eu poderia usar
Autenticavel como o tipo do método login() na classe
SistemaInterno!!!
10
Pensando alto...
•
Até funcionaria, se em Java existisse herança múltipla e
as classes Gerente e Diretor pudessem herdar de duas
classes simultaneamente...
11
Pensando alto...
•
Java não tem herança múltipla? #!?@! #!?@!
Por que eu fui escolher Java?
•
Foco! Qual é o problema? Ao compilar o método login(), o compilador
precisa ter certeza de que o objeto passado como parâmetro
implementa o método autentica(). Uma superclasse usada como tipo
resolveria o problema, mas Cliente, Diretor e Gerente não podem
pertencer à mesma hierarquia...
•
E se essas três classes assinassem um contrato se comprometendo
a implementar o método autentica(), o compilador aceitaria esse
contrato como um tipo? Sim, ele aceitaria! Em verdade,
esse mecanismo está previsto na linguagem e chama-se
interface
12
Um contrato.
13
Um contrato em Java
•
Gerentes, Diretores e Clientes podem agora assinar esse
contrato:
14
Um contrato em Java
15
Interfaces
•
Uma interface pode declarar uma série de métodos, mas
ela não contém a implementação desses métodos.
•
As classes que implementam uma interface devem,
obrigatoriamente, implementar seus métodos.
•
Todos os métodos de uma interface são, por definição,
públicos e abstratos.
•
Declarar a intenção de implementar uma interface e não
implementar seus métodos abstratos resulta em um erro
de compilação.
16
Interfaces
17
O Sistema Interno
•
A classe SistemaInterno pode agora ser escrita como:
18
O Sistema Interno
•
Instâncias de Diretor e Gerente podem ser passadas para
os dois métodos login(Autenticavel a) e
totalizaBonificaoes(Funcionario f)
•
Diretores e Gerentes são, ao mesmo tempo,
Autenticáveis (por implementar uma Interface) e
Funcionários (por estender a classe Funcionario)
•
No dia em que houver mais um funcionário com acesso
ao sistema, basta que a nova classe implemente a
interface Autenticavel.
19
Interfaces
•
Uma classe pode estender somente uma única classe,
mas ela pode implementar quantas interfaces forem
necessárias.
•
“Programe voltado a interface, e não à implementação”
20
Refatorações – Martin Fowler
21
Download