umliii

Salve, salve pessoas!
Hoje iremos direto ao ponto: relacionamentos do tipo IS A(N) (é um(a)) na UML.
Existem dois tipos de relacionamento IS A(N) dentro da OO:

  • Generalização ou herança
  • Realização ou implementação
Generalização
A generalização é a representação da capacidade de dois objetos, a e b, se relacionarem, de forma que a seja, ao mesmo tempo, uma instância de b, sem que b seja uma instância de a.
Como assim?
Pense no seguinte cenário: Todo carro é uma instância de objeto da classe Carro e, ao mesmo tempo, é uma instância de objeto da classe Veículo. Em contrapartida, qualquer instância de objeto da classe Veículo não necessariamente será uma instância da classe Carro. Ele poderá ser um Avião, um Trem ou uma Bicicleta.


A imagem acima ilustra o cenário anterior. Note que há uma seta ligando cada tipo de veículo à superclasse Veículo. Esta seta representa a relação de generalização na UML.
A OO permite que uma mesma classe herde características de várias outras classes. Isso é plenamente normal, cada criança é uma instância de objeto da classe Filho e carrega características (atributos) e trejeitos (operações) inerentes tanto ao objeto da classe Pai, quanto do objeto da classe Mãe.


Embora algumas linguagens de programação não permitam o uso de herança múltipla, a OO e a UML tratam a mesma sem maiores dificuldades. Nas classes acima, podemos entender que os objetos da classe Filho terão o sobrenome do Pai e os olhosPuxados da mãe (olhos orientais são dominantes sobre os demais).
Java é uma linguagem que não permite uso de herança múltipla. C++ permite. Por que? Simples, escolha que quem criou cada linguagem.

Realização
A realização pode ser entendida como uma possibilidade para "qualificar" um (ou vários) tipo(s) de classe(s). A realização, na OO está associada ao uso de interfaces. Uma interface é um elemento parecido com uma classe, porém, ela não pode ser estendida (não é possível associar uma classe e uma interface com a generalização).
Para representarmos uma realização, temos que definir que um elemento do diagrama de classes é uma interface. Isso pode ser feito através da inclusão de um stereotype (estereótipo) ao elemento criado. Existem vários stereotypes, um deles é "interface", que é o que precisamos no momento.
Veja:

A figura acima ilustra o que dissemos. Note que o elemento Programador possui, acima do nome, a indicação <<interface>>. Isso significa que ele é uma interface (deve ser interpretado como uma interface). Veja que a seta que segue da classe MeninoDaInformatica, para a interface Programador é tracejada. Isso indica uma relação de realização. Em termos mais claros, estamos dizendo que os objetos de MeninoDaInformatica serão também Pessoa, mas, terão comportamentos de Programador. Por isso dizemos que uma interface é como um adjetivo, ele qualifica, modifica as características originais que um objeto teria se fosse representado por sua classe, simplesmente.
Esta é uma alternativa para o uso da herança múltipla, principalmente em Java, que não tem suporte para tal relação. O Java permite que uma classe, que estenda (generalize) outra ou não, implemente (realize) tantas interfaces quanto forem necessárias.


Considerando a figura acima, fica mais fácil entender o que as interfaces fazem.
Veja que um Homem é uma Pessoa, porém, ele pode assumir os comportamentos de Filho, de Pai, de SuperHeroi, de ContadorDeHistoria, de Atleta e de Trabalhador. às vezes estes comportamentos podem ser simultâneos, porém, isso nem sempre acontece. É este o objetivo real das interfaces. Ampliar as capacidades de um objeto. Enquanto que a generalização tende a limitar estas capacidades.

A partir das relações de generalização e realização é possível trabalhar conceitos mais avançados de OO, como o famigerado (e temido) polimorfismo e o interessante encapsulamento. Estes são assuntos de posts mais avançados e chegaremos lá em momento oportuno.

Até breve e espero que tenha ajudado.


Nenhum comentário:

Postar um comentário