UML模型关系如何在C 中编码

How are UML model relationships coded in C++?

本文关键字:编码 模型 关系 UML      更新时间:2023-10-16

这个问题在我的考试修订中,我想知道我是否在正确的轨道上,它来自C 引物教科书。

如何在C 中编码UML模型关系?

公共继承使您可以建模IS-A关系,而派生的类能够重用基本类的代码。另一种方法是使用遏制,即一个对象拥有或具有另一个对象的对象之间的关系。这种模型has-a关系。

例如:

  • 汽车拥有或拥有电动机
  • 建造汽车时,它的电动机也是建造的
  • 当汽车被销毁时,它的电动机也会被销毁。

    class Car 
    {
        private:
            Motor *motor;
        public:
            Car()
            { 
                 motor = new Motor(); 
            }
            ~Car() 
            { 
                 delete motor; 
            }
    };
    

使用C ,建立构图关系比使用Java更容易。在最简单的情况下,包含的对象只是一个值成员:

class Car {
private:
  Motor motor;
  // No explicit construction/destruction required
};

当您要包含使用依赖性注入的呼叫者确定动态类型的AbstractMotor时,它会变得更加复杂。在这种情况下,要建模构图,您可以使用unique_ptr

class Car {
public:
  explicit Car(std::unique_ptr<AbstractMotor> motor): motor(std::move(motor)) { }
private:
  std::unique_ptr<AbstractMotor> motor;  // Still no explicit destruction required
};

unique_ptr确保您的CarMotor的唯一所有者,并且Motor的寿命与Car对象绑定。

当对象拥有另一个对象时,请尽量避免使用原始指针。使用unique_ptr,不必实现非平凡的破坏者或完全使用delete操作员。

我不会在您的答案中添加太多。

就IS-A关系而言, public 继承是C 中的工具(尽管使用模板时,它在使用模板时会变得棘手,并且并不总是按预期工作)。当涉及Has-A关系时,班级成员就是解决方案。确切地说,我会使用Motor motor成员(不是指针),因为这更强烈地强调了两者之间的关系。至于指针可以是null,将始终构建和破坏成员。

hth,
Elmes

公共继承使您可以建模IS-A关系,而派生的类能够重用基本类的代码。

这是一个常见的误解。继承点无法重复使用基类的代码,而是利用处理不同行为的基本类型的现有代码。也就是说,至少在OO理论中。

c 是一种强大的灵活语言,并且没有对语言的单一映射(这是那些期望从UML产生代码的人会一次又一次地失败的地方,UML不会捕获某些细性细节)。<<<<<<<<<</p>

概括实现均通过sashitance 0 在C 中实现,尽管它们在其他语言中都不同。例如,在Java 中,通过继承(extends)和实现通过接口实现(implements)实现了

coptosion 这是 has-a 关系,通常是通过类的 value成员实现的。请注意,这不是唯一的实现 1

聚合可以通过指针 2 和参考成员实现,具体取决于其他条件,包括两个对象的相对寿命,以及是否可以将参考重置为其他标准对象。

使用不是明确建模,而是发生使用关系可以存在于接口中(获取或返回其他类型使用该类型的对象的函数)或实现(在其中的函数定义使用其他类型的类型使用该类型的对象出于某种目的)也使用该类型。有些人认为这两个是使用的不同变体,第一个比第二个更严格,因为它添加了从使用的使用类型的更紧密的耦合到外部代码使用您的类型本身。

最后,使用模板还有其他多个选项。例如,语言中的std::vector<>::iteratorstd::deque<>::iterator之间没有关系,但是它们在语言中对 RandomAccessiterator 的概念进行了建模,并且旨在与a RandomAccesterator一起使用的模板以从std::sort的角度使用两者(例如std::sort),这两个 as 随机访问迭代器,该概念的关系是概括,尽管那是完全不存在代码(如果他们最终最终添加了概念的味道)。

)。

0)通常,我们只谈论公共继承,但事实并非如此。从其他类型公开继承的一种类型显然是概括/*实现*另一种类型/接口,但也可以通过私有继承发生。教学OO时通常不会出现的一件事是类具有两个单独的接口。一侧有一个 public 接口,您的类型用户通过该界面与对象进行交互。另一方面有一个虚拟接口,这是您类型和其他类型之间的合同。C 中的一个常见成语是NVI非虚拟界面,它试图通过强制分离来利用这一点:没有公共虚拟函数暗示公众和虚拟接口完全隔离。以同样的方式,T型可能与基础没有A 公共IS-A 关系,尽管内部可以将参考文献或指针传递给基本类型。对于那些子系统,T型T is-a 基础。受保护的继承可以被忽略,因为它被认为是没有用的,没有激励用法的例子。

1)在某些情况下,由于其他需求的驱动,只要在施工中分配并在封闭类型的破坏时释放,它就可以与指针类型的成员一起实施。在某些情况下,继承是滥用进行组成并执行尺寸优化(空基础优化)。例如,std::map可以从比较器继承(使用SFINAE来检测比较器何时是函数)。如果比较器的类型没有非常频繁的状态,则编译器可以将比较器和std::map的第一个成员放置在同一内存位置(即比较器不会占用任何空间)。

2)在包括智能指针的一般意义上考虑术语指针