Escolar Documentos
Profissional Documentos
Cultura Documentos
Nós vimos no conteúdo teórico e nas aulas práticas como podemos criar
nossas classes no código que estamos desenvolvendo. Vimos como criamos
as nossas classes e, também vimos como representamos os atributos e os
métodos que uma classe pode conter.
Métodos Acessores
+: público;
-: privado.
Herança
Superclasses e subclasses
Vamos ao seguinte exemplo: vamos imaginar que nós temos uma classe
Mamifero, que contém atributos comuns para todos os mamíferos, como por
exemplo: espécie e tempo de gestação, além do método mamar.
Agora, nós também podemos ter uma classe Cachorro. Perceba que a classe
Cachorro tem todos os atributos e métodos que a classe Mamífero tem, além
de possui atributos próprios (por exemplo: cor do pelo) e métodos próprios
(como por exemplo, latir).
Não faz sentido nós repetirmos o código que existe dentro da classe Mamifero
dentro da classe Cachorro. Na verdade, de maneira geral, repetição de código
não é um bom sinal dentro da aplicação, além de dificultar e muito a
manutenção da aplicação no futuro.
Como nós podemos resolver esta situação sem a repetição de código? Nós
podemos fazer com que a classe Cachorro herde a classe Mamífero. Dessa
maneira, a classe Cachorro conterá tudo que a classe Mamífero possui, só que
sem a repetição de código que iria ocorrer. Neste caso, a classe Mamífero
seria a nossa superclasse, enquanto a classe Cachorro seria a nossa
subclasse.
A herança é muito bem-vinda quando nós temos a relação de “ser” entre duas classes.
O exemplo acima ilustra este ponto perfeitamente: todo cachorro, no fundo, é um
mamífero também. Sendo assim, faz bastante sentido que a classe Cachorro herde a
classe Mamífero.
Nós temos ainda um outro nome que podemos dar para as classes Mamífero e
Cachorro. A classe Mamífero, que é nossa superclasse, também é chamada
de abstração; enquanto a classe Cachorro, que é a subclasse, também é
conhecida como concretização.
Interfaces e UML
Vamos imaginar a seguinte situação: nós temos uma classe para representar
os animais, a classe Animal. Nós sabemos que, de maneira geral, todos os
animais nascem, crescem, reproduzem-se e morrem. Este é um
comportamento padrão de todos os animais que existem na Terra. Sendo
assim, precisamos ter uma maneira de forçar que as classes que representem
os animais possuam os métodos em questão (nascer, crescer, reproduzir e
morrer). Nós podemos fazer isso criando uma interface, que podemos chamar
de SerVivo, por exemplo. Dessa maneira, a nossa classe
Animal implementaria a interface SerVivo.
Na UML, essa relação entre a interface SerVivo e a classe Animal poderia ser
representada da seguinte maneira:
Perceba que, pelo sentido da seta tracejada (que representa a implementação
da interface), indica que a classe Animal implementa a interface SerVivo e,
obrigatoriamente, a classe Animal terá os métodos nascer, crescer, r
No final das contas, nossas aplicações serão constituídas por várias classes,
que servirão de molde para vários objetos interagirem em nossa aplicação. Nós
sempre teremos objetos interagindo entre si em uma aplicação escrita com
uma linguagem orientada a objetos. O ponto é que estas interações podem ser
classificadas em dois grupos: composições e agregações. Além disso, a
quantidade de objetos envolvidos na interação nos permite descrever a
cardinalidade dessa relação.
Composição e agregação
Acima, nós temos a composição entre notas fiscais e itens de notas fiscais de
acordo com a UML.
Um exemplo clássico é a relação entre uma classe Pessoa e uma outra classe
Endereco. Ambos os objetos podem existir de maneira independente um do
outro (pois não são somente pessoas que possuem endereço). Mas, quando
unimos objetos da classe Pessoa com objetos da classe Endereco, nós
acabamos tendo uma pessoa mais “completa”: uma pessoa com um endereço.
O mesmo vale para o endereço: quando ele é unido com uma pessoa, ele
acaba também “fazendo mais sentido”. Quando dois ou mais objetos têm uma
relação nesse sentido, nós temos uma agregação.
Acima, nós temos a representação UML de uma relação de agregação.
Quando temos uma relação entre objetos, nós podemos definir a cardinalidade
deste relacionamento. Esta cardinalidade está relacionada à quantidade de
elementos que estão envolvidos na relação, quer seja uma agregação, quer
seja uma composição.
Cardinalidade Descrição
Uma nota fiscal pode conter no mínimo 1 e no máximo vários (N ou *) itens de nota
fiscal associados;
Um item de nota fiscal pode estar associado somente a uma única nota fiscal.