Muitos seres ou objetos da vida real apresentam propriedades comuns. Por exemplo, cachorros e gatos são animais. As
classes também podem ter propriedades comuns. As relações desse tipo entre classes podem ser esclarecidas por meio de
uma generalização. Extraindo as propriedades comuns para suas próprias classes, será mais fácil modificar o
modelo de negócios no futuro.
Uma classe que herda características gerais de outra classe chama-se descendente. A classe da qual o descendente é
herdeiro chama-se ascendente. Uma generalização mostra que uma classe é herdada de outra. Isso significa que a
definição do ascendente, incluindo qualquer atributo ou operação, também é válida para o descendente. As relações do
ascendente também são herdadas.
A generalização pode ocorrer em vários estágios, o que possibilita a modelagem de hierarquias de herança complexas e
com vários níveis, apesar de o número de níveis ser restrito para que o entendimento seja mais fácil. As propriedades
gerais são colocadas na parte superior da hierarquia de herança, ao passo que as especiais ficam na parte inferior da
hierarquia. Em outras palavras, você pode usar o relacionamento de generalização para modelar especializações de um
conceito mais geral.
Exemplo:
Os passageiros que chegam ao check-in do aeroporto trazem diferentes tipos de bagagem, Bagagem Normal, Bagagem de Mão e
Bagagem Especial. Do ponto de vista da companhia aérea, elas têm algumas propriedades comuns, além de serem bagagens,
cada bolsa tem um proprietário e um peso, por exemplo. Essas propriedades comuns podem ser modeladas pelos atributos e
operações em uma classe separada denominada Bagagem. Bagagem Normal, Bagagem de Mão e Bagagem Especial serão herdadas
dessa classe.
As classes Bagagem Normal, Bagagem de Mão e Bagagem Especial têm propriedades comuns. São especializações do conceito
geral de Bagagem.
Uma classe pode herdar várias outras classes; isso é chamado de "herança múltipla" - apesar de normalmente só herdar
uma. Se a classe herda várias classes, é importante verificar como as associações, os atributos e as operações são
denominados nos ascendente. Se o mesmo nome aparece em vários ascendentes, você deve descrever o que ele significa para
a classe herdante específica.
Uma classe que existe apenas para que outras classes possam herdá-la é uma classe abstrata. Uma classe abstrata nunca é
instanciada. Entretanto, um objeto de uma classe que herda uma classe abstrata está de acordo com sua própria descrição
e a descrição da classe herdada. As classes que são instanciadas no negócio são classes concretas.
Nesse contexto, o significado de "abstrato" é completamente diferente do significado comum. Algo pode muito bem ser
abstrato no sentido comum da palavra sem ser representado por uma classe abstrata. As lições de escola são fenômenos,
ou conceitos, abstratos porque não podem ser tocados. Entretanto, se você modelasse as tarefas escolares, uma lição
provavelmente seria semelhante a uma classe concreta, ou seja, uma classe que é instanciada. Da mesma maneira, os
fenômenos concretos como, por exemplo, produtos e pessoas, podem produzir classes abstratas, se tiverem propriedades em
comum com outras classes.
A finalidade principal de usar a herança é chegar a um modelo de objetos que acomode a mudança. Entretanto, a herança
deve ser usada com cuidado:
-
A herança é "somente" uma maneira de estruturar a descrição. Você visualiza os fenômenos que têm algumas
propriedades em comum.
Quando isso ocorre, você ainda precisa encontrar um funcionário capaz de realizar o trabalho do ascendente e do
descendente sempre que uma classe descendente for instanciada.
-
Use generalizações somente entre classes do mesmo estereótipo.
Como diferentes estereótipos de classe têm diferentes finalidades, a generalização de uma classe de um estereótipo
para uma classe de outro estereótipo não faria sentido. Se você permitir que uma classe de trabalhador de negócios
herde uma entidade de negócios, por exemplo, o trabalhador de negócios se tornaria um tipo de híbrido.
|