NOMES DE ATRIBUTOS SÃO STRINGS TAIS COMO "COR" OU "LOCALIZAÇÃO"
ATRIBUTOS PODEM SER DE QUALQUER TIPO E USAMOS PORTANTO UMA VARIÁVEL DE CLASSE Object
class Atributo { private String nome; private Object valor = null; public Atributo( String nome ) { this.nome = nome; } public Atributo( String nome, Object valor ) { this.nome = nome; this.valor = valor; } public String getNome() { return nome; } public Object getValor() { return valor; } public Object setValor( Object novoValor ) { Object valorVelho = valor; valor = novoValor; return valorVelho; } public String toString() { return nome + "='" + valor + "'"; } }
OBSERVE COMO OS CAMPOS DA CLASSE SÃO PRIVADOS E SÃO ACESSADOS ATRAVÉS DE MÉTODOS
DIGAMOS QUE OS OBJETOS SEJAM MANTIDOS EM ALGUMA ORDEM DE ACORDO COM A CHAVE valor (USANDO UMA TABELA HASH, DIGAMOS)
CASO PERMITÍSSEMOS ACESSO DIRETO A valor, O OBJETO NÃO SERIA COLOCADO NO LUGAR CORRETO DA TABELA HASH QUANDO FOSSE MODIFICADO DIRETAMENTE
ALÉM DE UM NOME, UMA COR TEM UMA REPRESENTAÇÃO INTERNA (ScreenColor)
A MUDANÇA ENTRE O NOME E O VALOR INTERNO PODE SER CARO E SÓ QUEREMOS FAZER A TRANSFORMAÇÃO UMA VEZ
VAMOS ESTENDER Atributo E CRIAR AtributoDeCor PARA IMPLEMENTAR A DECODIFICAÇÃO DO ATRIBUTO UMA ÚNICA VEZ
class AtributoDeCor extends Atributo { private ScreenColor minhaCor; // a cor decodificada public AtributoDeCor( String nome, Object valor ) { super( nome, valor ); decodificaCor(); } public AtributoDeCor( String nome ) { this( nome, "transparent" ); // chama outro construtor decodificaCor(); } public AtributoDeCor( String nome, ScreenColor valor ) { super( nome, valor.toString() ); minhaCor = valor; } public Object setValor( Object novoValor ) { // faca o trabalho de setValor da superclasse primeiro Object valRet = super.setValor( novoValor ); decodificaCor(); return valRet; } /** Seta valor para ScreenColor, nao descricao */ public ScreenColor setValor( ScreenColor novoValor ) { // faca o trabalho da superclasse primeiro super.setValor( novoValor.toString() ); ScreenColor valorVelho = minhaCor; minhaCor = novoValor; return valorVelho; } /** retorna cor decodificada */ public ScreenColor getCor() { return minhaCor; } /** seta ScreenColor a partir da descricao em getValor */ protected void decodificaCor() { // Falaremos de protected depois if( getValor() == null ) { minhaCor = null; } else { minhaCor = new ScreenColor( getValor() ); } } }
A CLASSE AtributoDeCor FAZ TUDO QUE Atributo FAZ E ADICIONA UM NOVO COMPORTAMENTO
Atributo É A SUPERCLASSE DE AtributoDeCor E AtributoDeCor É UMA SUBCLASSE DE Atributo
A HIERARQUIA DE CLASSE É Object -> Atributo -> AtributoDeCor
A CLASSE AtributoDeCor FAZ TRÊS COISAS BÁSICAS:
PROVÊ 3 CONSTRUTORES: DUAS SEMELHANTES AOS CONSTRUTORES DA SUPERCLASSE, E UM PARA PROVER UM OBJETO ScreenColor DIRETAMENTE
ELA FAZ OVERLOAD E OVERRIDE DO MÉTODO setValor PARA MUDAR O OBJETO DE COR QUANDO O VALOR MUDA
OVERLOAD É TER MAIS DE UMA FUNÇÃO COM ASSINATURAS (PARÂMETROS) DIFERENTES
OVERRIDE É PROVER UMA NOVA IMPLEMENTAÇÃO DE MÉTODOS DA SUPERCLASSE (COM A MESMA ASSINATURA)
ELA PROVÊ UMA NOVO MÉTODO getCor PARA RETORNAR O VALOR DA DESCRIÇÃO DE COR DECODIFICADA NO OBJETO ScreenColor
JAVA-22 home programa anterior próxima