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