首页 > 解决方案 > UML 类图:如何使用基类正确表示派生类的向量?

问题描述

我有一个应用程序,它由一个服务器组成,该服务器可以有两种类型的多个客户端,用户客户端设备客户端。为此,我有一个客户端基类的向量,我将在新客户端连接到服务器时添加它们。这是我所拥有的简化版本:

class Client
{
protected:
    int m_port;
    Client(int port): m_port{port}{}
public:
    virtual ~Client(){}
}

class User: public Client
{
public:
    User(int port): Client{port}{}
    virtual ~User(){}
}

class Device: public Client
{
public:
    User(int port): Client{port}{}
    virtual ~Device(){}
}

class Server
{
public:
    Server(int port): m_port{port}{}

    ~Server()
    {
       for (std::vector<Client*>::iterator it = m_clients.begin();
            it != m_clients.end();
            it++){
           free(m_clients.pop_back());
           }
    }

    void run()
    {
        if(m_port == 1){
            m_clients.pushback(new User(port));
        }else{
            m_clients.pushback(new Device(port));
        }
    }
private:
    int m_port;
    std::vector<Client*> m_clients;
}

我有以下 UML 表示:

在此处输入图像描述

我怀疑这个图表是否代表正确的意图。也许我对 UML 的经验不够丰富,这已经足够了,但我认为这张图并没有清楚地描述服务器中的向量将包含用户(s)和设备(s)而不是客户端(s)的事实。我不知道是否需要添加额外的刻板印象标签、额外的注释或额外的链接或关联,如下所示:

在此处输入图像描述

那么,如何在 UML 中正确表示这种 c++ 类关系?

标签: umlclass-diagram

解决方案


我认为这个图没有清楚地描述服务器中的向量将包含用户和设备而不是客户端的事实。我不知道我是否需要添加额外的刻板印象标签、额外的注释或额外的链接或关联

你只需要在你的第一个图中说类Client抽象的,你可以在图中用斜体显示它的名字。不要像在第二个图中那样添加关联。

警告在服务器m_client中是私有的,但您使用了 + 而不是 -

您在服务器客户端之间使用组合,您确定是这种情况,然后当服务器消失时客户端消失?C++ 代码中没有这样做。(见OP备注)

绘制m_client为关联后,无需将其也显示为属性。

客户端不知道服务器,这在绘制关联非双向(即Server -------> Client)时更加明显。

C++ 定义使用元素排序的向量,您可以使用{ordered}

由于 C++ 定义run with if(m_port == 1)a server has client(s) or-exclusive device(s),你可以通过一个约束来表示

<<ctor>并且<<vector>>没有在标准中定义,但我不反对他们的使用。


推荐阅读