TEM HERANÇA ÚNICA DE IMPLEMENTAÇÃO
NÃO DE IMPLEMENTAÇÃO, PARA NÃO COMPLICAR MUITO AS COISAS
PODEMOS ESTENDER A CLASSE Atributo MAS DESTA FORMA, Carro NÃO PODERIA TAMBÉM HERDAR DE, DIGAMOS, Veiculo
MAS PODEMOS DIZER QUE A NOVA CLASSE IMPLEMENTA UMA INTERFACE
UMA INTERFACE É ABSOLUTAMENTE ABSTRATA
SÓ TEM MEMBROS PÚBLICOS
OS MÉTODOS SÃO IMPLICITAMENTE ABSTRATOS
TAMBÉM PODE HAVER CONSTANTES (SEMPRE static E final)
class CarroComAtributos extends Carro implements ComAtributos { ... } public interface ComAtributos { void adiciona( Atributo novoAtributo ); // adiciona um atributo ao objeto Atributo localiza( String nomeAtributo ); // verifica se o objeto tem um dado atributo Atributo remove( String nomeAtributo ); // remove um atributo do objeto java.util.Enumeration atribs(); // retorna uma lista de atributos do objeto }
CADA CLASSE QUE IMPLEMENTA A INTERFACE DEVE IMPLEMENTAR OS MÉTODOS DA INTERFACE (OU DEVE SER ABSTRATA)
UMA INTERFACE SÓ É INTERESSANTE SE ALGUMA CLASSE (OU MAIS) A IMPLEMENTAR
VAMOS IMPLEMENTAR A INTERFACE ComAtributos USANDO UMA TABELA HASH PROVIDA PELA LINGUAGEM JAVA (java.util.Hashtable)
import java.util.*; class ImplComAtributos implements ComAtributos { protected Hashtable tabelaAtributos = new Hashtable(); public void adiciona( Atributo novoAtributo ) { tabelaAtributos.put( novoAtributo.getNome(), novoAtributo ); } public Atributo localiza( String nome ) { return (Atributo)tabelaAtributos.get( nome ); } public Atributo remove( String nome ) { return (Atributo)tabelaAtributos.remove( nome ); } public Enumeration atribs() { return tabelaAtributos.elements(); } }
A FUNÇÃO DE HASH JÁ ESTÁ EMBUTIDA NA IMPLEMENTAÇÃO DE Hashtable
atribs USA O CONCEITO DE ENUMERAÇÃO DO JAVA PARA PERMITIR FACILMENTE "ANDAR" NUMA ESTRUTURA DE DADOS SEM SABER COMO ELA FUNCIONA
ANDAR NUMA LISTA ENCADEADA É IGUAL A ANDAR NUMA TABELA HASH
PERMITIR DESACOPLAR O USO DA IMPLEMENTAÇÃO
CLASSES QUE REPRESENTAM COLEÇÕES DE OBJETOS FREQUENTEMENTE IMPLEMENTAM ENUMERAÇÕES
ENUMERAÇÕES TÊM DOIS MÉTODOS:
boolean hasMoreElements() QUE RETORNA true SE A ENUMERAÇÃO CONTIVER MAIS ELEMENTOS
Object nextElement() QUE RETORNA O PRÓXIMO ELEMENTO DA ENUMERAÇÃO
A FORMA DE USAR UMA ENUMERAÇÃO É COMO SEGUE:
Enumeration e = table.elements(); while( e.hasMoreElements() ) { facaAlgoCom( e.nextElement() ); }
PODEMOS USAR UMA IMPLEMENTAÇÃO COMO ImplComAtributos ATRAVÉS DE UMA SIMLES HERANÇA
PORÉM, SE PRECISAR SUPORTAR MAIS DE UMA INTERFACE OU SE QUISER ESTENDER UMA OUTRA CLASSE, É MELHOR USAR COMPOSIÇÃO
CRIAMOS UM OBJETO DA CLASSE QUE IMPLEMENTA A INTERFACE E USE FORWARDING PARA REPASSAR TODOS AS CHAMADAS DE MÉTODOS DA INTERFACE PARA ESTE OBJETO
ISTO É, REIMPLEMENTAMOS TODA A INTERFACE MAS CHAMAMOS A CLASSE DE IMPLEMENTAÇÃO DA INTERFACE PARA FAZER O TRABALHO REAL
class CarroComAtributos extends Carro implements ComAtributos { ImplComAtributos implAtributos = new ImplComAtributos(); // herda todos os metodos de carro CarroComAtributos() { super(); } CarroComAtributos( String name, Carro umCarro ) { super( nome, umCarro ); } // Use forwarding para todos os metodos de ComAtributos public void adiciona( Atributo novoAtributo ) { implAtributos.adiciona( novoAtributo ); } public Atributo localiza( String nome ) { return implAtributos.localiza( nome ); } public Atributo remove( String nome ) { return implAtributos.remove( nome ); } public Enumeration atribs() { return implAtributos.atribs(); } }
INTERFACES SÃO DIFERENTES DE CLASSE ABSTRATAS
VOCÊ PODE PROVER UMA FORMA DE HERANÇA MÚLTIPLA (SEM IMPLEMENTAÇÃO) COM INTERFACES
CLASSES ABSTRATAS PODEM TER UMA IMPLEMENTAÇÃO PARCIAL, PARTES protected, MÉTODOS ESTÁTICOS, ETC. MAS INTERFACES SÁO TÊM MÉTODOS PÚBLICOS SEM IMPLEMENTAÇÃO E CONSTANTES PÚBLICAS
CLASSES ABSTRATAS EVITAM O TRABALHO DE FAZER FORWARDING
QUALQUER CLASSE IMPORTANTE NO SEU PROJETO DEVERIA TER UMA INTERFACE