当前位置: 首页 > 知识库问答 >
问题:

UML 类图:如何使用派生类的基类正确表示派生类的向量?

章振
2023-03-14

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

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

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

共有1个答案

伯丁雷
2023-03-14

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

您只需要说Client类在第一个图中是抽象的,就可以在图中用斜体书写它的名称。不要像在第二个图中那样添加关联。

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

< s >您在服务器和客户端之间使用了一个组合,您确定是这样吗?当服务器消失时,客户端也会消失。C代码中没有这样做的内容。(参见OP备注)

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

客户端不知道服务器,这是更明显的绘制非双向关联(即<code>服务器-------

C定义使用向量,其中元素是有序的,您可以使用< code>{ordered}来指示属性是有序的

由于runwith的C定义,如果(m_port==1)服务器具有客户端或独占设备,则可以通过约束

<代码>

 类似资料:
  • 假设我有一个没有数据的类: 和派生类 Empty类的对象的大小为1。派生类的空部分的大小通常为0。据我所知,编译器看到基Empty类没有数据,因此它可以优化Empty的大小,以防它“在”Derived中,但标准并不要求这样做。 所以问题是: 我能在编译时确定Derived类的Empty部分并没有占用内存吗。 我知道我可以像一样进行检查...但它太冗长了,并且有几个类,如派生。有没有更优雅的解决方案

  • 问题内容: 因此,此代码的输出为。现在,我想到了一个问题:作为 派生 类对象的 po 怎么能调用作为基类的 PrivateOverride 的私有方法? 问题答案: 因为您在类中定义了main方法。如果将main方法放在Derived类中,它将无法编译,因为在该类中不可见。 class中的po.f()调用不是多态的,因为in 类为,所以in class中的值不会被覆盖。

  • 一个类的对象经常会是另一个类的对象。例如,矩形当然是四边形(正方形、平行四边形和梯形也是这样),因此可以说矩形类 Rectangle 是从四边形类 Quadrilateral 继承而来的。在本例中,类 Quadrilateral 叫做基类,类 Rectangle 称为派生类。矩形是四边形的一种特殊类型,但是要说四边形是矩形则是不正确的。图 9.1 示例了几个简单的继承例子。 基类 派生类 stud

  • 问题内容: 在我的spring项目中,我的Dao类具有以下模板: 我的每个Dao类都具有以下结构: 这意味着当我调用方法findById,findByField,findAll时,我应该从Usuario,Usuario和List类型接收对象。 这两个拳头类的返回正确值,但最后一个不返回。当我运行此方法时(从我的服务类中): 我应该看到“ usuario”时收到“对象”作为响应。有人可以告诉我我在做

  • 下面是一个人为的例子:(实际代码中使用的命名方案太令人困惑) 我有一个班主任,他是第三方图书馆的一部分,不可更改。我也有一些课程延伸到父亲;比如儿子。祖父有一个类似这样的构造函数: 这个构造函数中实际发生的事情并不重要。重要的是,它所做的任何事情都必须由所有派生类完成,因此对的调用是每个派生类构造函数的第一行。这里的含义是,祖父的所有后代的构造函数,无论距离有多远,都必须始终调用super(或调用

  • 从已有的对象类型出发建立一种新的对象类型,使它部分或全部继承原对象的特点和功能,这是面向对象设计方法中的基本特性之一。继承不仅简化了程序设计方法,显著提高了软件的重用性,而且还使得软件更加容易维护。派生则是继承的直接产物,它通过继承已有的一个或多个类来产生一个新的类,通过派生可以创建一种类族。   继承 基本概念 在定义一个类A时,若它使用了一个已定义类B的部分或全部成员,则称类A继承了类B,并称