UML Class 图:如何使用其基 class 正确表示派生 classes 的向量?
UML Class Diagram: How do I correctly represent a vector of derived classes using their base class?
我有一个由服务器组成的应用程序,该服务器可以有两种类型的多个客户端,用户客户端和设备客户端。为此,我有一个客户端基础矢量 class,我将在新客户端连接到服务器时将其添加到其中。这是我所拥有的简化版本:
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) 而不是 Client(s)。我不知道我是否需要放置一个额外的刻板印象标签,一个额外的注释,或者一个额外的 link 或者像这样的关联:
那么,如何在 UML 中正确表示此 c++ class 关系?
I think this diagram doesn't clearly depict the fact that the vector in the server will contain User(s) and Device(s) and not Client(s). I don't know if I need to put an extra stereotype label, an extra note, or an extra link or association
你只需要在你的第一个图中说 class Client 是 abstract ,你可以证明写它图中斜体字的名字。不要像在第二张图中那样添加关联。
警告 m_client
在 Server 中是私有的,但您使用了 + 而不是 -
你使用了Server和Client之间的组合,你确定是这样然后当服务器消失时客户端消失? C++ 代码中没有这样做。(参见 OP 备注)
已将 m_client
绘制为关联,因此没有必要将其也显示为属性。
客户端不知道服务器,这更容易绘制非双向关联(即Server -------> Client
)。
C++ 定义使用 vector 对元素进行排序,您可以指示 属性 使用 {ordered}
进行排序
由于 运行 的 C++ 定义 if(m_port == 1)
服务器有客户端或独占设备,您可以指出通过约束
<<ctor>
和 <<vector>>
未在标准中定义,但我不反对使用它们。
我有一个由服务器组成的应用程序,该服务器可以有两种类型的多个客户端,用户客户端和设备客户端。为此,我有一个客户端基础矢量 class,我将在新客户端连接到服务器时将其添加到其中。这是我所拥有的简化版本:
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) 而不是 Client(s)。我不知道我是否需要放置一个额外的刻板印象标签,一个额外的注释,或者一个额外的 link 或者像这样的关联:
那么,如何在 UML 中正确表示此 c++ class 关系?
I think this diagram doesn't clearly depict the fact that the vector in the server will contain User(s) and Device(s) and not Client(s). I don't know if I need to put an extra stereotype label, an extra note, or an extra link or association
你只需要在你的第一个图中说 class Client 是 abstract ,你可以证明写它图中斜体字的名字。不要像在第二张图中那样添加关联。
警告 m_client
在 Server 中是私有的,但您使用了 + 而不是 -
你使用了Server和Client之间的组合,你确定是这样然后当服务器消失时客户端消失? C++ 代码中没有这样做。(参见 OP 备注)
已将 m_client
绘制为关联,因此没有必要将其也显示为属性。
客户端不知道服务器,这更容易绘制非双向关联(即Server -------> Client
)。
C++ 定义使用 vector 对元素进行排序,您可以指示 属性 使用 {ordered}
由于 运行 的 C++ 定义 if(m_port == 1)
服务器有客户端或独占设备,您可以指出通过约束
<<ctor>
和 <<vector>>
未在标准中定义,但我不反对使用它们。