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