【问题标题】:UML Class Diagram: How do I correctly represent a vector of derived classes using their base class?UML 类图:如何使用基类正确表示派生类的向量?
【发布时间】:2020-12-17 18:06:35
【问题描述】:

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

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 不是很有经验,这已经足够了,但我认为这张图并没有清楚地描述服务器中的向量将包含 User(s) 和 Device 的事实(s)而不是客户(s)。我不知道我是否需要像这样添加额外的刻板印象标签、额外的注释或额外的链接或关联:

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

【问题讨论】:

    标签: uml class-diagram


    【解决方案1】:

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

    您只需要在您的第一个图表中说类 Clientabstract,您可以在图表中以斜体字显示它的名称。不要像在第二张图中那样添加关联。

    警告m_clientServer 中是私有的,但您使用的是 + 而不是 -

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

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

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

    C++ 定义使用一个 vector 其中元素是有序的,您可以使用 {ordered} 指示属性是有序的

    由于 run 的 C++ 定义与 if(m_port == 1) 一起,服务器具有客户端或独占设备,您可以通过约束来表明这一点

    &lt;&lt;ctor&gt;&lt;&lt;vector&gt;&gt; 没有在标准中定义,但我不反对使用它们。

    【讨论】:

    • 感谢 cmets。我只是为这篇文章添加了&lt;&lt;ctor&gt;&gt;&lt;&lt;vector&gt;&gt;,而我在完整的(更大的)图表中没有。你是对的,我没有把它放在这个代码示例中,但是,当服务器消失时,所有客户端都会消失。我会修改帖子以反映这一点。
    • 好的,所以基本上回答了原来的问题,我只需要指出 Client 是抽象的,对吧? (顺便说一句,感谢其他 cmets 提供的未询问但我需要知道的事情)
    • @m4l490n 是的
    • @m4l490n 是的,无法实例化抽象类,在您提供的 C++ 代码中就是这种情况,因为构造函数不是公共的,因此客户端实际上是用户或设备假设没有其他类继承 Client
    猜你喜欢
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    相关资源
    最近更新 更多