2. UML类图关系之我见

本文详细解析了UML类图中的六种关系:泛化、实现、关联、聚合、组合和依赖。通过实例代码和逻辑分析,帮助读者理解这些概念的区别及应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【本人为非计算机软件专业,可以说相差很远的专业;本博客原创内容极为个人自学理解,望大家批判看待,也请大家多多指正!】

由于项目组里面都是C++菜鸟,最近感觉整体进展比较迟缓,因此要重新梳理一遍程序中类的关系,因此开始深入理解UML类图。其实类之间的关系不外乎有6中:泛化、实现、关联、聚合、组合和依赖。网上的解释也很多,概念上理解起来都很清晰明了。其中,泛化、实现都很容易理解,并且在代码实现上也都很明确;但是,后四种区分起来较为困难,尤其在代码实现上又极为相似。


1. 泛化

泛化关系指的就是类之间的继承,这几区分起来比较明显,并且代码实现也比较明了,详见其他文章。


2. 实现

实现是指类与接口的实现。这个关系之前没有见过,好像在C++中使用较少。具体了解可以戳http://qimo601.iteye.com/blog/1393427


3. 关联

表示拥有关系,可以是单向关系也可以是双向的,代码以成员变量形式表示。


4. 聚合

表示整体与部分之间的关系,但是部分可以与整体分离,但是整体的生命周期不影响部分的声明周期,代码同样以成员变量形式表示。


5. 组合

表示整体与部分之间的关系,但是部分随着整体的删除而产出,两者的联系更紧密,代码同样以成员变量形式表示。


6. 依赖

表示使用关系,代码体现形式为局部变量,方法的参数或静态方法的调用。

--------------------------------------------------------------------------------------------------------------以下几个谈一下自己想看法-------------------------------------------------------------------------------------


可以看出,3、4、5的代码体现形式都是成员变量,那么实际中怎么区分就变得很困难。网上很多都说区分聚合与组合的方法是看是用的指针定义还是直接定义,如果采用指针定义则表示聚合,使用直接定义表示组合关系。个人认为,这样判断虽然是按照两者的区别来进行并且也符合其不同,但是并不正确。因为大多数情况下,我们用自己写的类来定义成员变量时都会采用指针形式。


因此,我们在区分聚合和组合是最重要的是通过语意来进行,同时也可以通过观察以下构造函数代码形式来辅助判断。

class Brain
{/*................*/}

class Pedestrian
{
private:
     Brain* brain;

public:
    Pedestrian();
}

class Cluster
{
private:
      Pedestrian* ped;

public:
     Cluster(Pedestrian* p);
}


//Pedestrian.cpp

Pedestrian::Pedestrian()
{
      brain = new Brain();
}

//Cluster.cpp

Cluster::Cluster(Pedestrian* p)
{
     ped = p;
}

因为在产生对象的构造函数中new产生的对象,在对象析构时必须delete掉,因此它是与整体生命周期相关联的,而通过表达式传递赋值的对象说明他的产生独立于整体对象。


区分了聚合和组合,我们再来看看关联和聚合。相对于聚合和组合来说,关联和聚合更难区分。大众说法是关联表示拥有关系,而聚合表示整体与部分的俄关系,整体与部分不也可以理解为拥有和被拥有的关系吗?又有解释就说了,由关联表示的类之间是平等的。其实这两种说法的理解表示了关联的两种表示,一种是单向关联,另一种是双向关联。这么一说单向关联还真的和聚合相似呢?


看了一些例子之后,感觉还真是。网上的某个例子指出公司和员工之间是关联关系,为什么不能理解为公司和员工之间是聚合关系呢。我认为,这是完全可以的。只要看你的目的是什么了。要是你要想说明公司的运作,那么可以认为公司和员工之间是关联的;如果你更像强调公司的构成,那么聚合关系则要显得更好。所以要针对你想说明的问题来进行对待区分。


最后,我认为类图应该是出现在程序的设计阶段,所以大部分情况下是在程序编写前的一种语意逻辑关系;在代码编写后依据代码在分析类之间的关系肯定会比较吃力,要尽量在程序设计阶段明确各类之间的关系,方便指导代码的编写,而不是依据代码指导类关系的完成。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值