Vídeo: Diagrama de Classe - Generalização/Especialização/Herança - Astah 2024
É natural classificar objetos em categorias e organizar categorias em subcategorias. Se você procura um lugar para viver, você se encontra categorizando uma unidade de moradia como uma casa, apartamento, moradia, condomínio, mansão, e assim por diante. As casas podem, por sua vez, ser ainda organizadas por estilos como o rancho, o nível dividido, o colonial e o saltbox. O UML fornece uma notação para capturar esses tipos de classificações - também conhecida como generalização e especialização - e utilizá-los como modelador e programador.
Alguns desenvolvedores orientados a objetos terão grandes comprimentos para economizar um pouco de trabalho. Quando eles podem modelar uma vez e reutilizá-la, eles estão interessados. Se eles podem escrever um método (o código do programa para uma operação) para uma classe apenas uma vez e usá-la muitas vezes, então inscreva-as para maior produtividade. Se você quer economizar tempo, especificando atributos e operações uma vez e depois reutilizando-os muitas vezes, continue lendo.
Ao definir classes, você pode notar que algumas classes possuem os mesmos atributos ou as mesmas operações. Quando este é o caso, você coloca esses recursos comuns (atributos, operações e assim por diante) em uma classe mais genérica chamada superclasse. As classes que compartilham os recursos comuns são conhecidas como subclasses da superclasse. Por exemplo, o comprimento do material gravado em uma fita de vídeo, fita de áudio, disco compacto ou filme é um atributo de todos os quatro tipos de mídia gravada. Essas classes também podem compartilhar outros atributos, como suas dimensões físicas e a data em que cada uma delas foi usada para fazer uma gravação. Neste caso, a superclasse seria RecordedMedia, as subclasses seriam Videotape, Audiotape, CompactDisc e MovieFilm, e alguns atributos compartilhados poderiam incluir recordingLength e totalLength.
Esse processo de encontrar atributos ou operações similares em classes é conhecido como generalização. Por exemplo, você generaliza o atributo recordLength para uma classe mais genérica chamada RecordedMedia. O processo para mostrar uma generalização em UML é simples:
1. Identifique as subclasses.
Localize classes com os mesmos atributos e / ou operações. Essas classes são suas subclasses.
2. Crie uma superclasse.
Forneça uma superclasse para manter os atributos e / ou operações comuns das subclasses. Dê à superclasse um nome que categoriza todas as subclasses. Colocar a superclasse acima das subclasses no diagrama torna mais fácil a leitura, mas não é necessário.)
3. Adicione recursos comuns à superclasse.
Remova os atributos e operações comuns das subclasses e coloque-os (uma vez) na superclasse.
4. Desenhe uma relação de generalização.
Você desenha uma linha de generalização de cada subclasse para a superclasse. Em UML, a linha de generalização é representada como uma linha contínua com uma ponta de seta oca na extremidade da superclasse. Na UML, uma linha com a ponta de flecha oca que conecta uma subclasse a uma superclasse é conhecida como uma relação de generalização.
Depois de criar uma superclasse com os recursos comuns, como atributos e operações, as subclasses herdam esses recursos da superclasse. Desta forma, você só precisa escrever os recursos comuns uma vez na superclasse em vez de muitas vezes em cada uma das subclasses.
Você pode dizer se você tem uma generalização olhando o idioma que você (ou outros) usam para descrever a relação entre as classes. Observe que, ao descrever as mídias gravadas e seus vários tipos, como a fita de vídeo anteriormente nesta seção, apareceu a frase "quatro tipos de mídia gravada". Se você se encontra usando frases como "tipo de" ou "tipo de", então é provável que você tenha uma generalização em suas mãos.
Diga que um de seus clientes está preocupado em acompanhar os materiais em um arquivo. Este cliente acumulou diferentes tipos de mídia gravada , como fitas de vídeo e fitas de áudio. Como modelistas, você precisa capturar as diferenças entre esses meios, bem como suas semelhanças. O diagrama na Figura 1 mostra os começos de várias generalizações, dispostas em uma hierarquia de herança .
Figura 1: Hierarquia de herança simples.
Os desenvolvedores usam o termo generalização ou herança para se referir ao mesmo conceito de reutilização de atributos compartilhados e operações que você mostra em uma superclasse e reutilização em subclasses. A generalização refere-se ao conceito de generalização de especificidades (as subclasses) para o genérico (a superclasse). A herança refere-se ao efeito da generalização nas subclasses.
Quando você vê uma relação de generalização entre as classes, seu significado é muito diferente do de uma associação associação entre classes. Uma associação é, em última instância, uma relação entre muitos objetos - algumas instâncias de uma classe têm um relacionamento (link) com instâncias da outra classe. Em uma relação de generalização entre classes , o relacionamento é realmente sobre as aulas. O melhor que você pode dizer é que um objeto criado a partir de uma subclasse contém todos os recursos da subclasse e da superclasse.
Você só tem um objeto de uma classe em uma relação de generalização. Mesmo que você mostre duas classes, a subclasse e a superclasse, você só possui um objeto que seja criado. Você pode pensar em um objeto da classe Videotape também ser um objeto da classe RecordedMedia por causa da herança. A Figura 2 mostra um objeto criado a partir da classe Videotape com todos os seus atributos.(A instância de uma classe é representada como um símbolo de objeto.) Você não tem dois objetos diferentes (um para RecordedMedia e outro para Videotape), apenas um objeto. Quando o objeto vtu83-1023 foi criado, todos os valores de seus atributos foram definidos. A gravação na fita é de 57 minutos. O comprimento total da fita física é de 60 minutos. A fita é uma videocassette Umatic com uma altura de 10 polegadas, uma largura de 7 polegadas e uma profundidade de 1. 5 polegadas. A gravação é analógica, e um registro do conteúdo da fita é anexado à fita para que o arquivista faça referência.
Figura 2: Uma instância que mostra todos os atributos herdados.
Você só tem uma instância definida por uma subclasse e sua superclasse. A subclasse e a superclasse podem ter uma operação de construtor (para criar a instância) e uma operação de destrutor (para destruir a instância). Quando o seu software é executado e você cria uma instância de uma subclasse, o construtor da superclasse é executado primeiro, seguido pelo construtor da subclasse. Quando chega a hora de eliminar a instância que você criou, o destruidor da subclasse é chamado primeiro, seguido do destrutor da superclasse. Se as coisas são mais complexas porque você tem subclasses de subclasses, lembre-se: os construtores são invocados do topo da hierarquia de herança para a parte inferior; Os destrutores são chamados em ordem da subclasse mais baixa até a superclasse mais alta.