[MÚSICA] [MÚSICA] Olá, bem vindo ao curso de orientação a objetos com Java. Eu sou Clovis Fernandes e vamos dar continuidade à apresentação sobre diagramas de classe. Nós já vimos sobre os conceitos de classe, associação e multiplicidade. Agora veremos os conceitos de navegabilidade, agregação, composição e herança no contexto de diagramas de classes da UML. Quanto à navegabilidade, tem a ver com o que é que uma classe enxerga da outra. Esse exemplo que eu estou mostrando, a navegabilidade é bidirecional eu não estou colocando nenhuma seta indicando a direção, então eu tenho Cliente enxerga Pedido e Pedido enxerga Cliente. Ou seja, Cliente vai poder ter 0 ou mais objetos pedidos e pedido deverá ter exatamente objeto cliente, porque a navegabilidade é bidirecional. Outra maneira de representar isso é através de setas. Que eu coloco seta de lado e do outro mostrando a direção da navegabilidade, a direção da visibilidade de uma classe relação à outra. Estou mostrando aqui. A outra, olhando a classe Pedido e Pagamento, a associação Pedido com Pagamento, a navegabilidade a gente chama de unidirecional porque, apenas a classe Pedido é que enxerga a classe Pagamento. Objetos Pedido vão enxergar objetos de Pagamento. A seta indica isso. Ou seja, o Pagamento não vai enxergar Pedido nesse momento. Isso não quer dizer que é assim e o projeto não pode mudar, não. A navegabilidade ela pode mudar de acordo com os novos requisitos e você vai inserindo no seu programa ou mudando requisitos anteriores. Vamos falar agora da associação do tipo agregação. O exemplo que nós colocamos, o Carro tem Roda, a Roda pertence a Carro. No rótulo da associação, a gente está colocando até uma seta. Porque eu posso ler de lado e do outro. Tá certo? Então a Roda, ela faz parte do Carro. O Carro tem Roda. Na verdade, o carro no nosso exemplo agora, tem 4 rodas. Exatamente 4 rodas. Então eu posso ler isso de lado e do outro. Agregação, tem a ver com esse fato de você estar usando o conceito de ter alguma coisa ou fazer parte de alguma coisa. Que é o que caracteriza agregação. Então a associação, o rótulo da associação quando significa ter, possuir ou equivalente, eu posso chamar essa associação de agregação. Essa associação que eu estou colocando agora, é uma associação normal, associação normal. Eu simplesmente tenho rótulo que é [tem]. Então carro tem 4 rodas. O fato de fazer isso já caracteriza que é uma agregação. Agora, eu posso representar isso de uma maneira melhor na UML? Posso! Basta usar esse símbolo que é diamante, vazado, branco. Esse símbolo caracteriza a agregação. Ao mesmo tempo, eu não preciso mais colocar o rótulo da associação, o verbo da associação. Eu não preciso mais falar que carro tem 4 rodas. Basta eu colocar, carro, o símbolo da agregação e 4 rodas. Não preciso mais colocar também a parte de baixo, de pertence, é desnecessário. No nosso exemplo aí, o objeto carro for eliminado. Ele for totalmente eliminado. O que é que acontece com os objetos roda que estavam agregados? Não acontece nada. O objeto carro é eliminado, mas os outros são objetos que antes de fazer a agregação eles já existiam. Então eles não podem ser eliminados. Nós vimos agregação. Agora eu vou apresentar para vocês a composição. Composição é uma associação qualquer, ela é muito parecida com agregação, o rótulo dela também é o de ter, possuir. Então no nosso exemplo aí o livro possui ou tem capítulos, então isso caracteriza algo muito parecido com agregação. Eu estou usando que o livro, ele tem ou mais capítulos, eu esto dizendo que o capítulo faz parte do livro por isso é verdadeiro. Tem uma diferença relação à agregação, no caso da simbologia nós usamos diamante preto, isso caracteriza a composição. E qual a diferença da composição com agregação? Vocês lembram que quando era agregação o objeto que agregava, o carro, naquele exemplo, quando eu eliminava o carro, os objetos que estavam sendo agregados ao carro, que eram as rodas ele não era eliminado, eles não eram eliminados. Se o carro era eliminado as rodas não eram eliminadas, porque elas pré existiam, elas estavam existentes antes da criação do objeto carro. Agora na agregação, na composição, desculpe, o que é que ocorre? O livro se ele for eliminado, todos os capítulos vão ser eliminados juntos, porque o tempo de vida dos objetos da composição, as partes né, do todo, eles são eliminados juntos. Porque eles foram criados pelo objeto que compõem todos eles. Então eu crio o livro e dentro de livro eu começo a criar os capítulos, com isso ao eliminar o livro eu elimino também todos os capítulos, nesse exemplo. Isso que diferencia a agregação de composição. Quando elemento que agrega é eliminado na agregação os componentes, os seus componentes não são eliminados, na composição quando componente que compõe os outros é eliminado, os outros também são eliminados. Bom, iremos falar agora de herança. Herança relaciona uma classe com a sua subclasse. No nosso exemplo, temos a classe pagamento, que tem 3 subclasses, que caracterizam maneiras diferentes de fazer pagamento. Então, eu tenho pagamento por cartão de crédito, pagamento por dinheiro vivo e pagamento por cheque. A herança ela também, eu posso estar olhando de baixo para cima. Olhando a herança como olhei anteriormente, está olhando de cima para baixo. Por isso é que eu tenho uma seta herança, lá mostrando a seta pra baixo. Já o conceito inverso é o de generalização. Suponha que eu tivesse as classes, cartão de crédito, dinheiro e cheque, generalizar significa você criar uma classe, que é mais geral que essas 3, que no caso seria pagamento e eu passaria algumas responsabilidades que são comuns dessas classes, para a classe pagamento. Isso chama-se generalização, o contrário disso é a especialização, Ou herança, especialização na verdade é tipo de herança mais comum. Como é que eu reconheço que uma classe, se a estrutura de herança que eu estou fazendo funciona? Basta olhar o relacionamento é-um. Então cartão de crédito é tipo de pagamento, Ohh, então cartão de crédito é uma subclasse. Pagamento por dinheiro vivo, é tipo de pagamento? Também é então, beleza. Pagamento por cheque, é tipo de pagamento? Também, ok, então o relacionamento é-um foi satisfeito. Então eu quero, por exemplo, pagar com balas. Bala é tipo de pagamento? Não. Bala não é tipo de pagamento, então o relacionamneto é-um nessa característica de examinar o relacionamento é-um ajuda a determinar se a classe é subclasse de outra se outra classe ela tem subclasse. Nesse outro diagrama de herança, nós temos algumas coisas interessantes. Na classe abstrata eu não posso criar instâncias dela, eu só uso para fazer, transmitir métodos comuns a todas as subclasses. Já na classe concreta, aí eu posso fazer instâncias dela. Então na classe abstrata não dá pra criar objetos dela, na classe concreta dá pra criar. Como é que eu descubro que a classe é abstrata? Vendo ou colocando ela como itálico. Isso já identifica normalmente. Nem todo editor vai permitir que eu coloque itálico. Verdade, aí basta você colocar cima do nome da classe que ela é uma classe abstrata, basta colocar lá abstrata. E aí o nome não vai estar itálico mas tem uma informação dizendo que a classe é abstrata. Com isso, nós completamos a apresentação dos conceitos mais básicos e usuais de diagramas de classe. Algumas coisas ficaram ainda sem serem trabalhadas. Algumas nós vamos trabalhar exercícios outras nós vamos, iremos apresentar à medida que o assunto requeira esse conceito, aí nós apresentaremos nesse momento, então vão ser diagramas de sequência, notação para subsistemas. e coisas desse tipo. Obrigado. [MÚSICA] [MÚSICA}