Relacionamentos que as Transformações UML-para-C++ Transformam

A transformação transforma vários tipos de relacionamentos UML em elementos C++. O modo como a transformação transforma os relacionamentos depende do tipo de relacionamento.

Relacionamentos de Associação UML

A transformação gera variáveis de membros a partir dos relacionamentos de associação UML. Em associações sem composição, a transformação inclui o operador de ponteiro (*) no qualificador de tipo do atributo. A tabela a seguir lista as propriedades de extremidade da associação que a transformação utiliza para gerar elementos C++.

Propriedade UML Elemento C++
Nome Nova variável de membro
Visibilidade Visibilidade da variável de membro

Relacionamentos de Generalização UML

A transformação gera uma herança para o destino de um relacionamento de generalização UML e suporta herança múltipla. A transformação inclui o arquivo de cabeçalho de destino no arquivo de cabeçalho gerado. Você pode especificar o escopo da herança, e se a herança é ou não virtual, configurando as propriedades do estereótipo «cpp_generalization».

Relacionamentos de Dependência UML

Geralmente, um relacionamento de dependência referencia uma classe ou enumeração. Por padrão, a transformação gera uma referência avançada no arquivo de cabeçalho C++ e gera uma diretiva #include no arquivo de corpo.

Para transformar um relacionamento de dependência em uma diretiva #include em um arquivo de cabeçalho, configure o campo isInclusionInHeader do estereótipo «cpp_dependency» como true. A aplicação do estereótipo «cpp_friend» a um relacionamento de dependência também gera uma diretiva #include no arquivo de cabeçalho e inclui a palavra-chave friend antes do nome do elemento de dependência.

Relacionamentos de Realização de Interface UML

Uma classe UML pode implementar uma interface UML. A transformação transforma este relacionamento em uma herança em uma classe C++. A transformação aplicará a palavra-chave public à herança se o estereótipo «cpp_generalization» for aplicado ao relacionamento de realização e se o valor da propriedade GeneralizationKind for public.

A tabela a seguir lista o código que a transformação gera quando transforma o relacionamento de implementação entre Class2 e Interface1 e o relacionamento de dependência com o estereótipo «cpp_friend» é aplicado entre Class2 e Class1.

Elementos UML Saída da Transformação
Esta imagem ilustra o diagrama UML descrito no parágrafo anterior.
#ifndef CLASS2_H
#define CLASS2_H
//Iniciar seção para o arquivo Class2.h
//TAREFA A FAZER: Incluir definições preservadas
//Encerrar seção para o arquivo Class2.h

#include "Interface1.h"
#include "Class1.h"

//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
class Class2 : Interface1
{

    //Iniciar seção para Class2
    //TAREFA A FAZER: Incluir atributos a serem preservados
    //Encerrar seção para Class2

    public:
        friend class Class1;

};  //encerrar Classe Class2

#endif

Parâmetros de Modelo UML

A transformação gera uma classe de modelo a partir de uma classe UML que tenha parâmetros de modelo.

Relacionamentos de Ligação UML (Classes Instanciadas)

A transformação transforma uma classe UML que tenha um relacionamento de ligação com uma classe de modelo nomeada Class1 em uma instanciação da classe de modelo Class1. A transformação utiliza a substituição de parâmetros que o relacionamento de ligação especifica para resolver parâmetros formais em parâmetros reais.

Se uma classe for a consumidora em vários relacionamentos de ligação, a transformação transformará apenas o primeiro relacionamento de ligação encontrado.

A transformação inclui os tipos de dados dos parâmetros de modeloo na lista de inclusões de classes instanciadas.

A transformação não suporta padrões de uso complexo das classes de modelo, como a inclusão de variáveis estáticas em modelos e classe parametrizadas que são utilizadas como parâmetros formais.

No exemplo a seguir, TemplateClass1 é uma classe de modelo com um parâmetro de modelo chamado T1. Binding1 é uma instanciação de modelo que substitui T1 para ParamClass1 no relacionamento de ligação entre Binding1 e TemplateClass1. UserClass1 tem um atributo do tipo Binding1. A transformação transforma Binding1 em um typedef, entretanto, neste exemplo, UserClass1 utiliza a instanciação de modelo Binding1 em vez de typedef. No código, você pode utilizar o typedef que a transformação gera ou a instanciação de modelo. A transformação gera um typedef compatível com versões anteriores da transformação UML-para-C++.
Elementos UML Saída da Transformação
Esta imagem ilustra o exemplo descrito no parágrafo anterior. TemplateClass1.h:
#ifndef TEMPLATECLASS1_H
#define TEMPLATECLASS1_H
//Iniciar seção para o arquivo TemplateClass1.h
//TAREFA A FAZER: Incluir definições preservadas
//Encerrar seção para o arquivo TemplateClass1.h

//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
template <class T1>
class TemplateClass1
{

    //Iniciar seção para TemplateClass1
    //TAREFA A FAZER: Incluir atributos a serem preservados
    //Encerrar seção para TemplateClass1

    private:

        //@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        T1 attribute1;
    public:

        //@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int Operation1(T1 Parameter1);

};  //encerrar Classe TemplateClass1

#endif
TemplateClass.cpp:
#include "TemplateClass1.h"
//Iniciar seção para o arquivo TemplateClass1.cpp
//TAREFA A FAZER: Incluir definições preservadas
//Encerrar seção para o arquivo TemplateClass1.cpp


//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
template <class T1> int TemplateClass1<T1>::Operation1(T1 Parameter1) 
{
    //TAREFA A FAZER Stub de método gerado automaticamente
    return 0;
}
ParamClass1.h:
#ifndef PARAMCLASS1_H
#define PARAMCLASS1_H
//Iniciar seção para o arquivo ParamClass1.h
//TAREFA A FAZER: Incluir definições preservadas
//Encerrar seção para o arquivo ParamClass1.h

//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
class ParamClass1
{

    //Iniciar seção para ParamClass1
    //TAREFA A FAZER: Incluir atributos a serem preservados
    //Encerrar seção para ParamClass1

};  //end Class ParamClass1

#endif
UserClass1.h:
#ifndef USERCLASS1_H
#define USERCLASS1_H
//Iniciar seção para o arquivo UserClass1.h
//TAREFA A FAZER: Incluir definições preservadas
//Encerrar seção para o arquivo UserClass1.h

#include "TemplateClass1.h"
#include "ParamClass1.h"

//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
class UserClass1
{

    //Iniciar seção para UserClass1
    //TAREFA A FAZER: Incluir atributos a serem preservados
    //Encerrar seção para UserClass1

    private:

        //@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        TemplateClass1<ParamClass1> attribute1;

};  //encerrar Classe UserClass1
Binding1.h:
#ifndef BINDING1_H
#define BINDING1_H
//Iniciar seção para o arquivo Binding1.h
//TAREFA A FAZER: Incluir definições preservadas
//Encerrar seção para o arquivo Binding1.h

#include "TemplateClass1.h"
#include "ParamClass1.h"



typedef TemplateClass1<ParamClass1> Binding1;

#endif

Feedback