Vous êtes sur la page 1sur 6

Curso de Informtica Programao I - Prof.

Anbal Notas de aula 8

ASSOCIAO ENTRE CLASSES Sempre que um atributo de uma classe no de tipo primitivo, temos uma associao desta classe com alguma outra. O primeiro caso deste que vimos foi com os atributos do tipo String, que , como j sabemos, no um tipo primitivo. Todo string um objeto da classe String de Java. Vamos agora ver exemplos de associaes entre classes que ns mesmos construmos. Suponhamos uma classe Cliente com dois atributos apenas, cdigo e dataDeNascimento. O cdigo um nmero inteiro que identifica o cliente, portanto, um tipo primitivo (int), mas a data de nascimento composta de trs valores inteiros (dia, ms e ano). Logo, nosso atributo de data deveria ser desmembrado em trs atributos inteiros. mais conveniente, neste caso, criarmos uma classe Data com os trs atributos, e dar este tipo ao atributo dataDeNascimento. Por outro lado, a classe Data pode implementar uma srie de funcionalidades atravs de seus mtodos, como retornar a data em formatos diversos (ex: 10 de agosto de 2006, 10/08/2006, 10-08-06, etc.). Uma classe como estas certamente ter muita utilidade para diversas outras.
public class Data { private int dia; private int mes; private int ano; public public public public public public public public public } public class Cliente { private int codigo; private Data dataDeNascimento; //associa a classe Data classe Cliente ..... } Data(int d, int m, int a){...}//constri uma data String dataBarra(){...}//devolve data na forma dd/mm/aaaa int dataInvertida(){...}//devolve data int na forma aaaammdd void leData(){...}//l do teclado uma data String dataExtenso()//devolve data por extenso dd de mmmmmm de aaaa int obtemDia(){...}//devolve o dia int obtemMes(){...}//devolve o ms int obtemAno(){...}//devolve o ano String obtemMesExtenso()//devolve o ms por extenso

Na modelagem, usando a linguagem UML, a associao indicada por uma linha cheia com uma seta aberta direcionada da classe que possui o atributo para a classe que d tipo a este atributo. Em nosso exemplo, teramos: Cliente Data

A seta indica que um objeto cliente conhece um objeto data, mas um objeto data no conhece o objeto cliente.

Programao I - Prof. Anbal - Notas de aula 8

O significado da associao Uma associao (binria) um relacionamento estrutural entre duas classes, especificando que os objetos de uma classe esto conectados a objetos de outra. No caso apresentado, cada objeto cliente estar ligado a um objeto data. Por exemplo, se o cliente de cdigo 123 nasceu no Natal de 1980, podemos representar o objeto correspondente assim: Cliente codigo dataDeNascimento 123 dia mes ano Data 25 12 1980

Dizemos que se pode navegar do cliente para a data, mas o inverso no garantido. Tambm pode-se dizer que o objeto data visvel pelo objeto cliente, mas o inverso no pode ser afirmado. Relao entre as existncias dos dois objetos Se a existncia do objeto data dependente ou no da do objeto cliente, isto varia conforme a aplicao do mundo real. Vamos examinar aqui, duas possibilidades e suas solues em Java: a) a data existe em funo do cliente, isto , o objeto data construdo junto ou aps a construo do objeto cliente, e destrudo junto com a destruio do cliente; neste caso, o objeto cliente se encarrega de fazer a instanciao do objeto data; b) a data tem existncia independente, ou seja, o objeto data pode ser instanciado antes da criao do objeto cliente, caso em que a instanciao da data no pode ficar a cargo do objeto cliente. Construo dependente do objeto associado Comecemos pelo caso (a), em que o construtor do cliente instancia o objeto data. Vamos codificar um construtor para a classe Cliente. A finalidade do construtor inicializar os atributos do objeto que est sendo instanciado. Vamos fazer um construtor que inicializa o cdigo e a data de nascimento do cliente.
public class Cliente { private int codigo; private Data dataDeNascimento; public Cliente(int umCodigo, int umDia, int umMes, int umAno) { codigo = umCodigo; dataDeNascimento = new Data(umDia, umMes, umAno); } .... }

Este construtor recebe o cdigo do cliente e a data do seu nascimento. O cdigo atribudo diretamente por ser do tipo primitivo int. O trs valores da data so passados como argumentos para um construtor da classe Data, isto , o objeto dataDeNascimento instanciado neste momento. Para ilustrar, o cliente de cdigo 123 que nasceu no Natal de 1980 ser criado assim:
Cliente c = new Cliente(123, 25, 12, 1980);
Programao I - Prof. Anbal - Notas de aula 8

A figura ilustra o objeto c na memria: c Cliente codigo dataDeNascimento 123 dia mes ano Data 25 12 1980

Uma outra alternativa criar o objeto cliente sem uma data de nascimento e inseri-la mais tarde. Neste caso, precisamos um outro construtor (sobrecarregado) com um s parmetro para o codigo:
public Cliente(String umCodigo) { codigo = umCodigo; dataDeNascimento = null; }

Na memria, teremos:
Cliente c = new Cliente(123);

Cliente codigo dataDeNascimento 123 null

Naturalmente, a classe Cliente precisaria, neste caso, ter um mtodo especfico para inserir a data de nascimento mais tarde.
public void insereDataDeNascimento(int umDia, int umMes, int umAno) { dataDeNascimento = new Data(umDia, umMes, umAno); }

Antes de examinarmos o caso (b), vamos ver o uso do atributo dataDeNascimento. Usando o atributo objeto O atributo dataDeNascimento uma referncia a um objeto Data. Logo, atravs desta referncia podemos chamar os diversos mtodos da classe Data a partir dos mtodos da classe Cliente. Por exemplo, um mtodo que exibe os dados do cliente na tela pode ser:
public void exibeDados() { System.out.println("Cdigo do cliente: " + codigo); System.out.println("Data de nascimento: " + dataDeNascimento.dataBarra());

} Observe que, obviamente, a classe Cliente no tem acesso direto aos atributos da classe Data, pois estes so private. O acesso feito sempre atravs da interface pblica da classe (os mtodos, que devem ser pblicos, naturalmente). Assim, dentro da classe Cliente a chamada dataDeNascimento.dia causaria um erro de compilao.
Programao I - Prof. Anbal - Notas de aula 8

Construo independente do objeto associado Agora vamos ao caso (b). Para isso, teremos que usar uma terceira classe que instancia objetos cliente e data de forma independente. Vamos usar uma classe TestaCliente.
public class TestaCliente { public static void main(String args[]) { Data d = new Data(12, 12, 1980); ... Cliente c = new Cliente(123); ... c.insereDataDeNascimento(d); ... } }

Repare que neste caso, a data criada antes, quando o cliente ainda nem existe. Depois de criar o cliente, o objeto d passado como argumento para um mtodo que vai atualizar o objeto cliente. Obviamente, este mtodo insereDataDeNascimento uma sobrecarga daquele que j programamos acima. Ele bem simples:
public void insereDataDeNascimento(Data dt) { dataDeNascimento = dt; }

Exerccio. Dada a classe abaixo:


public class Endereco { private String ruaNumero; private String cidade; private String uF; private String cep; public endereco(String rN, String cd, String u, String cp){...} //constri um endereo public void mudaRuaNumero(String novoRuaNum){...} public void mudaCidade(String novaCidade){...} public void mudaUf(String novaUf){...} public void mudaCep(String novoCep){...} public String obtemRuaNumero(){...}//devolve o valor de ruaNumero public String obtemCidade(){...}//devolve nome da cidade public String obtemUf(){...}//devolve a Unidade da Federao public String obtemCep()//devolve o valor do C.E.P. }

acrescente classe Cliente um atributo de nome endereco, e altere ou acrescente o que for necessrio em termos de mtodos e construtores, para permitir cadastrar endereo dos clientes, junto com o seu cadastramento ou mais tarde.

Programao I - Prof. Anbal - Notas de aula 8

Outro exemplo Apresentamos um outro exemplo de associao. Supondo que um banco no admita contas-correntes conjuntas, e aproveitando as classes Cliente e Data j vistas neste captulo, podemos ter:
public class ContaCorrente { private int numero; private Cliente cliente; private Data dataDeAbertura; private double saldo; ..... }

O diagrama abaixo modela a situao proposta: ContaCorrente Cliente Data

Observe as navegaes possveis. Um objeto conta-corrente pode acessar o objeto cliente, mas, este no pode acessar a conta-corrente da qual ele o titular. Supondo que no referido banco um cliente s possa ter uma conta-corrente (o que , alis, j foi norma vlida no Brasil em algum momento), poderamos dotar a classe Cliente de um atributo para indicar a sua conta:
private ContaCorrente conta;

Ento, a linha de associao entre ContaCorrente e Cliente passaria a ser bidirecional, indicando-se com setas em ambas as extremidades ou simplificando-se para uma linha sem setas, que a notao UML mais aplicada para este caso. ContaCorrente Cliente Data

Diferena entre associao e dependncia Quando uma classe, em um ou mais de seus mtodos, utiliza um objeto de outra classe, dizemos que a primeira classe depende da segunda. Existe, aqui, portanto, um relacionamento de Dependncia. o que ocorre, por exemplo, numa classe de teste, quando instancia objeto e depois chama mtodos da classe testada. Outro exemplo que tem sido comum em nosso curso, o uso da classe Teclado. Quando uma classe qualquer usa a classe Teclado, ela instancia um teclado para poder usar os mtodos de leitura de dados. Ento, a classe depende da classe Teclado. O relacionamento deste tipo representado, em UML, por uma linha tracejada com uma seta aberta, apontando a classe de que a outra depende. Exemplo:

Programao I - Prof. Anbal - Notas de aula 8

TestaCliente

Cliente

Teclado

Data

O diagrama de classes UML acima mostra relacionamentos de associao e de dependncia. fcil evitar confuso entre os dois tipos: s existe associao quando uma classe tem atributo cujo tipo a outra classe. A UML prev quatro categorias de relacionamentos entre classes: alm das duas vistas neste texto (Associao e Dependncia), existe a Generalizao (tambm chamada de Especializao), que implementada pelo mecanismo de Herana (assunto das notas de aula 6), e a Realizao, que no ser estudada em Programao I. A Agregao um tipo especial de associao e a Composio um tipo especial de Agregao. Estes dois tipos especiais de associao so tratados, por muitos autores, como conceitos avanados de modelagem e no sero estudados aqui. Exerccios 1. Dado o modelo UML abaixo, marque V ou F para cada sentena seguinte: Empresa Empregado

( ) A classe Empresa tem um atributo do tipo Empregado, mas a classe Empregado no tem atributo do tipo Empresa. ( ) Todo objeto empregado sabe qual a empresa que o emprega, e todo objeto empresa sabe quais so seus empregados. ( ) A classe Empresa no tem atributo do tipo Empregado, ela apenas instancia objetos do tipo Empregado. ( ) Na classe Empregado existe algum atributo do tipo Empresa. 2. Num sistema hospitalar, temos as classes Paciente, Mdico, Data e Endereco. Todo paciente tem uma data de nascimento, um endereo e um mdico de sua preferncia. Cada mdico tem sua data de nascimento, sua data de admisso no hospital e um endereo. Mostre as associaes existentes entre as classes. 3. A classe Baralho tem um atributo do tipo Carta. A classe JogoDeCartas no tem atributos, mas ela instancia um baralho e instancia, tambm, cartas. Desenhe um diagrama UML mostrando as trs classes e os relacionamentos presentes.

Programao I - Prof. Anbal - Notas de aula 8

Vous aimerez peut-être aussi