Princípios de Análise e
Projeto Orientados a
Objetos com UML
Eduardo Bezerra
Editora CAMPUS
1
Capítulo 9
Generalização
Se eu vi mais longe que outros, é porque eu me apoiei nos
ombros de gigantes.
Isaac Newton
2
Introdução
 O modelo de classes também pode
representar relacionamentos entre classes.
 Esses denotam relações de generalidade ou
especificidade entre as classes envolvidas.


o conceito mamífero é mais genérico que o
conceito ser humano.
o conceito carro é mais específico que o conceito
veículo.
 Chamado de relacionamento de
generalização.
3
Introdução
 Também pode ser chamado de
relacionamento de especialização, pois a
generalização e a especialização são dois
pontos de vista do mesmo relacionamento.
 O termo herança também é comumente
utilizado como sinônimo do relacionamento
de generalização. (implementação)
 A generalização pode ser utilizada tanto no
modelo de classes de domínio quanto no de
especificação.
4
Introdução
5
Semântica de uma generalização,
.
6
Terminologia
 subclasse X superclasse.
 supertipo X subtipo.
 classe base X classe herdeira.
 classe de especialização X classe de
generalização.
 ancestral e descendente (generalização em
vários níveis)
7
Notação para generalização
Superclasse
Subclasse1
Subclasse2
Superclasse
... SubclasseN
Subclasse1
Subclasse2
... SubclasseN
8
Generalização X Associação
 Importante: a generalização difere da
associação (agregação, composição ) porque
a primeira se trata de um relacionamento
entre classes.


“Gerentes são tipos especiais de funcionários”.
“Gerentes chefiam departamentos”.
 Na associação, objetos específicos de uma
classe se associam entre si ou com objetos
específicos de outras classes.
9
Herança de associações
 Atributos e operações e associações são
herdados pelas subclasses.
Realiza
Cliente
1
ClientePessoaFísica
Pedido
*
ClientePessoaJurídica
10
Hierarquias de generalização
11
Hierarquias de generalização
 A generalização pode ser aplicada em vários
níveis (hierarquia de generalização).

uma classe que herda propriedades de uma outra
classe pode ela própria servir como superclasse.
 Características importantes:
 Transitividade: uma classe em uma hierarquia
herda propriedades e relacionamentos de todos
os seus ancestrais..
 Assimetria: dadas duas classes A e B, se A for
uma generalização de B, então B não pode ser
uma generalização de A. Ou seja, não pode haver
ciclos em uma hierarquia de generalização.
12
Hierarquias de generalização
Pessoa
-nome
-dataNascimento
-endereco
Cliente
-status
O atributo status define se o
cliente é comum ou especial.
Empregado
-matrícula
-dataContratação
Vendedor
-taxaComissão
13
Herança múltipla
14
Herança múltipla
 Herança múltipla: Uma classe pode ter mais
de uma superclasse.

Tal classe herda de todas a suas superclasses.
 O uso de herança múltipla deve ser evitado.
 Esse tipo de herança é difícil de entender.
 Algumas LPs não dão suporte à implementação
desse tipo de herança (Java e Smalltalk).
15
Exemplo (Herança múltipla)
Barco
Carro
CarroAnfíbio
16
Classes abstratas
17
Relacionamentos de dependência
 Usualmente, a existência de uma classe se
justifica pelo fato de haver a possibilidade de
gerar instâncias (classes concretas).
 No entanto, podem existir classes que não
geram instâncias diretas: classes abstratas.
 Utilizadas para organizar e simplificar uma
hierarquia de generalização.

Propriedades comuns a diversas classes podem
ser organizadas e definidas em uma classe
abstrata a partir da qual as primeiras herdam.
 Subclasses de uma classe abstrata também
podem ser abstratas, mas a hierarquia deve
terminar em uma ou mais classes concretas.
18
Notação para classes abstratas
 Na UML, uma classe abstrata é representada
com o seu nome em itálico.
ContaBancária
ContaCorrente
ContaPoupança
19
Definição de restrições
sobre uma generalização
20
Restrições sobre generalizações
 Restrições sobre generalizações são
representadas (entre chaves) no diagrama de
classes próximas à linha do relacionamento.
 Restrições predefinidas pela UML:




Sobreposta
Disjunta
Completa
Incompleta
21
Exemplos (Restrições sobre
generalizações)
FiguraGeométrica
Veículo
{incompleta, disjunta}
{incompleta}
Caminhão
Homem
Trator
Elipse
Quadrado
Círculo
Indivíduo
Atleta
{completa, disjunta}
{incompleta, sobreposta}
Mulher
Nadador
Corredor
22
Refinando o modelo de
classes com generalização
23
Refinando o modelo de classes com
generalização
 A generalização permite refinar o modelo de
classes.

Idéia básica: identificar abstrações mais genéricas
ou mais específicas que outras.
 Refinamentos podem seguir segundo duas
estratégias alternativas e complementares:


Generalização: criar uma classe mais genérica, e
definir as classes semelhantes como subclasses.
Especialização: criar classes mais específicas a
partir de uma classe preexistente.
24
Refinando o modelo de classes com
generalização
 O seguinte teste pode ser realizado para
identificar se duas classes X e Y se
relacionam por generalização:
X é um tipo de Y?
 Regra da substituição: seja a classe A uma
generalização de outra B. Não pode haver
diferenças entre utilizar instâncias de B ou de
A, do ponto de vista dos usuários de A.

Ou seja, é inadequado o uso de generalização
onde nem todas as propriedades da superclasse
fazem sentido para a subclasse.
25
Conformidade das subclasses à
superclasse
Cliente
*
*
ContaBancária
-número
-dataAbertura
-saldo
+debitar()
+creditar()
ContaCorrente
-limiteSaque
HistóricoTransações
1
*
ContaPoupança
-dataAniversário
-rendimento
26
Dicas
 Deve-se evitar a construção de hierarquias
de generalização muito profundas (com mais
de três níveis)

dificultam a leitura do diagrama.
 Papéis e subclasses não devem ser
confundidos.


Um papel corresponde ao uso de uma certa
classe em uma associação.Uma classe pode
assumir vários papéis.
O modelador deve evitar a criação de subclasses
em situações que podem ser resolvidas através
da utilização de papéis.
27
Papel X Subclasse
Inadequado
Adequado
Pessoa
morador
Pessoa
Edifício
*
Morador
*
Edifício
*
*
28
Herança de operações e
polimorfismo
29
Herança de operações e polimorfismo
 Uma subclasse herda todas as propriedades
de sua superclasse que tenham visibilidade
pública ou protegida.
 Entretanto, pode ser que o comportamento
de alguma operação herdada seja diferente
para a subclasse.



Nesse caso, a subclasse deve redefinir o
comportamento da operação.
A assinatura da operação pode ser reutilizada.
A implementação da operação (método) é
diferente.
30
Operações polimórficas
 Operações polimórficas são operações de
mesma assinatura definidas em diversos
níveis de uma hierarquia de generalização e
que possuem comportamento diferente.

assinatura é repetida na(s) subclasse(s) para
enfatizar a redefinição de implementação.
 Operações polimórficas implementam o
princípio do polimorfismo no qual duas ou
mais classes respondem a mesma
mensagem de formas diferentes.
 Objetivo: garantir que as subclasses tenham
uma interface em comum.
31
Operações polimórficas
 Operações polimórficas facilitam a
implementação.



Se duas ou mais subclasses implementam a
mesma operação polimórfica, a mensagem a ser
passada é a mesma para todas elas.
O remetente da mensagem não precisa saber
qual a verdadeira classe de cada objeto, pois eles
aceitam a mesma mensagem.
A diferença é que o método que implementa a
operação é diferente em cada classe.
32
Exemplo (Operações polimórficas)
return salárioBase;
return comissão * obterSalárioBase();
Funcionário
-salárioBase : Moeda
+obterPagamento() : Moeda
+definirSalárioBase(in umSalario : Moeda)
+obterSalárioBase() : Moeda
Vendedor
-comissão : Porcentagem
+obterPagamento() : Moeda
33
Operações abstratas e polimorfismo
 Em termos de operações, uma classe é
abstrata quando ela possui pelo menos uma
operação abstrata.
 Uma operação abstrata não possui
implementação.


Uma classe pode possuir tanto operações
abstratas quanto operações concretas.
Uma classe que possui pelo menos uma
operação abstrata é abstrata.
 Uma subclasse que herda uma operação
abstrata e não fornece uma implementação é
ela própria abstrata.
34
Operações abstratas e polimorfismo
 As classes Círculo e Quadrado são
concretas, pois fornecem implementação
para a operação abstrata herdada.
FiguraGeométrica
+desenhar()
Círculo
+desenhar()
Operação abstrata. Subclasses
devem implementar o
comportamento desta operação.
Quadrado
+desenhar()
35
Operações abstratas e polimorfismo
 Classes ContaCorrente e ContaPoupança
redefinem a operação aplicarJuros.
ContaBancária
-saldo : Moeda
+aplicarJuros(in umaTaxa : Porcentagem)
+debitar(in umaQuantia : Moeda)
+creditar(in umaQuantia : Moeda)
ContaCorrente
ContaPoupança
+aplicarJuros(in umaTaxa : Porcentagem)
+aplicarJuros(in umaTaxa : Porcentagem)
36
Reuso através de delegação
37
Reuso por generalização
 O reuso por generalização se baseia na
noção de subclasses herdando
comportamento de sua superclasse.

Exemplo: um objeto ContaCorrente não tem como
atender à mensagem para executar a operação
debitar só com os recursos de sua classe. Ele,
então, utiliza a operação herdada da superclasse.
 Vantagem: fácil de implementar.
 Desvantagem:
 Exposição dos detalhes da superclasse às
subclasses (Princípio do encapsulamento).
 Possível violaçào do Princípio de Liskov (regra da
substituição).
38
Reuso por delegação
 A delegação é outra forma de realizar o
reuso.
 “Sempre que um objeto não pode realizar
uma operação por si próprio, ele delega uma
parte dela para outro(s) objeto(s)”.
 A delegação é mais genérica que a
generalização.

um objeto pode reutilizar o comportamento de
outro sem que o primeiro precise ser uma
subclasse do segundo.
39
Reuso por delegação
 O compartilhamento de comportamento e o
reuso podem ser realizados em tempo de
execução.
 Desvantagens:


desempenho (implica em cruzar a fronteira de um
objeto a outro para enviar uma mensagem).
não pode ser utilizada quando uma classe
parcialmente abstrata está envolvida.
40
Generalização X Delegação
adicionar(objeto, topo)
topo := topo + 1
remover(objeto)
topo := topo - 1
Vetor
Pilha
+adicionar()
+remover()
+obter()
+empilhar()
+desempilhar()
1
topo := topo + 1
vetor.adicionar(topo, objeto)
return vetor.obter(topo)
topo := topo - 1
1
Pilha
+empilhar()
+desempilhar()
Vetor
+adicionar()
+remover()
+obter()
41
Generalização X Delegação
 Há vantagens e desvantagens tanto na
generalização quanto na delegação.
 De forma geral, não é recomendado utilizar
generalização nas seguintes situações:



Para representar papeis de uma superclasse.
Quando a subclasse herda propriedades que não
se aplicam a ela.
Quando um objeto de uma subclasse pode se
transformar em um objeto de outra subclasse.

Por exemplo, um objeto Cliente se transforma em um
objeto Funcionário (vide a seguir).
42
Classificação dinâmica
43
Classificação dinâmica
 Problema na especificação e implementação
de uma generalização.

Um mesmo objeto pode pertencer a múltiplas
classes simultaneamente, ou passar de uma
classe para outra.
 Considere uma empresa em que há
empregados e clientes.



Pode ser que uma pessoa, em um determinado
momento, seja apenas cliente;
depois pode ser que ela passe a ser também um
empregado da empresa.
A seguir essa pessoa é desligada da empresa,
continuando a ser cliente.
44
Classificação dinâmica
 As principais LPOO (C++, Java, Smalltalk)
não dão suporte direto à implementação da
classificação dinâmica.

se um objeto é instanciado como sendo de uma
classe, ele não pode pertencer posteriormente a
uma outra classe.
 Solução parcial: definir todas as possíveis
subclasses em uma determinada situação.

Exemplo (para a situação descrita há pouco): as
classes Empregado, Cliente e EmpregadoCliente
seriam criadas.
45
Classificação dinâmica
 Não resolve o problema todo:
 Pode ser que um objeto mude de classe!
(metamorfose)
 A adição de novas classes à hierarquia torna o
modelo ainda mais complexo.
 Uma melhor solução: utilizar a delegação.
 Uma generalização entre cada subclasse e a
superclasse é substituída por uma composição.
 Exemplo no próximo slide.
46
Classificação dinâmica
Empregado
Cliente
Pessoa
0..1
0..1
1
Cliente
Empregado
1
Pessoa
47
Classificação dinâmica
 Comentário final: nada impede que haja uma
hierarquia de classes em um modelo de
domínio onde um objeto possa pertencer a
mais de uma subclasse, ou possa mudar de
subclasse.
 No modelo de especificação é que o
modelador deve considerar a reestruturação
da hierarquia de classes para resolver o
problema.
48
Download

AP_04Bezerra