文档章节

关联,聚合和组成之间有什么区别?

 技术盛宴
发布于 02/20 21:36
字数 1669
阅读 126
收藏 0

关联,聚合和组成之间有什么区别? 请在执行方面进行说明。


#1楼

对于两个对象, FooBar可以定义关系

关联 -我与一个对象有关系。 Foo使用Bar

public class Foo { 
    void Baz(Bar bar) {
    } 
};

构图 -我拥有一个对象,并且对其生命负责。 当Foo去世时, Bar去世

public class Foo {
    private Bar bar = new Bar(); 
}

汇总 -我有一个东西是我从别人那里借来的。 当Foo去世时, Bar可能会继续生存。

public class Foo { 
    private Bar bar; 
    Foo(Bar bar) { 
       this.bar = bar; 
    }
}

#2楼

摘自Robert Martin在comp.object中的帖子:

关联表示一个实例向另一个实例发送消息的能力。 尽管通常也可以将其实现为方法参数或创建局部变量,但这通常使用指针或引用实例变量来实现。

//[Example:]

//|A|----------->|B|

class A
{
  private:
    B* itsB;
};

聚合是典型的整体/部分关系。 这与关联完全相同,但实例不能具有循环聚合关系(即,一部分不能包含其整体)。

//[Example:]

//|Node|<>-------->|Node|

class Node
{
  private:
    vector<Node*> itsNodes;
};

这是聚合的事实意味着Node的实例无法形成循环。 因此,这是节点树而不是节点图。

组成完全类似于聚合,只是“部分”的生命周期由“整个”控制。 此控件可以是直接的或传递的。 也就是说,“整个”可能直接负责创建或销毁“零件”,或者可以接受已经创建的零件,然后将其传递给承担此责任的其他整体。

//[Example:]

//|Car|<#>-------->|Carburetor|

class Car
{
  public:
    virtual ~Car() {delete itsCarb;}
  private:
    Carburetor* itsCarb
};

#3楼

我知道这个问题被标记为C#,但是概念是非常通用的问题,例如此处的重定向。 因此,我将在这里提供我的观点(从Java的观点来看,我比较自在一些偏见)。

当我们想到面向对象的性质时,我们总是会想到对象,类(对象蓝图)及其之间的关系。 对象是相关的,并通过方法彼此交互。 换句话说,一个类别的对象可以使用由另一类别的对象提供的服务/方法。 这种关系称为关联。

聚集和构成是关联的子集,意味着它们是关联的特定情况。

在此处输入图片说明

  • 一个类的聚集和组合对象中,“拥有”另一类的对象
  • 但是有细微的差别。 在《 合成 》中,属于其所属类的对象所拥有的类的对象不能独立存在 (也称为“死亡关系”)。 它始终将作为其拥有对象的一部分存在,在聚合中 ,从属对象是独立的,并且即使拥有类的对象已死也可以存在。
  • 因此,在合成中,如果拥有对象是垃圾回收,那么拥有对象也将是垃圾回收,聚合时不是这种情况。

困惑?

构成示例 :考虑一个汽车和一个特定于该汽车的发动机的示例(这意味着它不能在任何其他汽车中使用)。 CarSpecificEngine类之间的这种关系称为合成。 如果没有SpecificEngine类的对象,则Car类的对象将不存在,而如果没有Car类,SpecificEngine的对象将不具有意义。 用简单的话来说,Car类仅“拥有” SpecificEngine类。

汇总示例 :现在考虑Class CarWheel类。 汽车需要Wheel对象才能起作用。 意味着Car对象拥有Wheel对象,但是如果没有Car对象,我们不能说Wheel对象没有意义。 它非常适合用于自行车,卡车或其他汽车物体。

总结一下-

总结起来,关联是一个非常通用的术语,用于表示一个类何时使用另一个类提供的功能。 我们说,如果一个父类对象拥有另一个子类对象,并且没有父类对象,该子类对象就无法有意义地存在,那就是组成。 如果可以,则称为聚合。

此处有更多详细信息。 我是http://opensourceforgeeks.blogspot.in的作者,并在上面添加了指向相关文章的链接,以获取更多背景信息。


#4楼

关联是关系的广义概念。 它包括“组合”和“聚合”。

组合混合 )是一种将简单对象或数据类型包装到单个单元中的方法 。 合成是许多基本数据结构的关键构建块

聚集集合 )与普通组成不同,因为它并不暗示所有权。 在合成中,当拥有对象被破坏时,所包含的对象也会被破坏。 总体而言,这不一定是正确的。

两者都表示物体之间的关系,只是强度不同。

绝招要记住的区别:有A - A ggregation和O WN - C 0 mpositoin

在此处输入图片说明

现在让我们观察下图

关系

在此处输入图片说明

比喻:

构图 :以下图片是图像构图,即使用单个图像制作一张图像。
在此处输入图片说明

聚合 :在单个位置收集图像

在此处输入图片说明

例如,一所大学拥有多个系,每个系都有许多教授。 如果大学关闭,这些系将不再存在,但这些系中的教授将继续存在。 因此,大学可以看作是系的组成,而系则是教授的集合体。 此外,一位教授可以在一个以上的系中工作,但是一个系不能属于一个以上的大学。


#5楼

依赖关系 (参考)
这意味着两个对象之间没有概念上的联系。 例如,EnrollmentService对象引用了Student和Course对象(作为方法参数或返回类型)

public class EnrollmentService {
    public void enroll(Student s, Course c){}
}

协会 (有)
这意味着对象之间几乎总是存在链接(它们是关联的)。 订单对象有一个客户对象

public class Order {
    private Customer customer
}

汇总 (有+一部分)
一种特殊的关联,其中两个对象之间存在整体关系。 他们也许会彼此生活。

public class PlayList{
    private List<Song> songs;
}

注意:最棘手的部分是区分聚集与正常关联。 老实说,我认为这有不同的解释。

组成 (有+整体+所有权)
特殊的聚合。 Apartment由一些Room组成。 没有Apartment Room不能存在。 删除公寓时,所有关联的房间也会被删除。

public class Apartment{
    private Room bedroom;
    public Apartment() {
       bedroom = new Room();
    }
}

本文转载自:https://stackoom.com/question/3iTJ/关联-聚合和组成之间有什么区别

粉丝 0
博文 1578
码字总数 0
作品 0
深圳
高级程序员
私信 提问
加载中

评论(0)

组合,关联,聚合的区别

类间关系 在类图中,除了需要描述单独的类的名称、属性和操作外,我们还需要描述类之间的联系,因为没有类是单独存在的,它们通常需要和别的类协作,创造比单独工作更大的语义。在UML类图中,...

长平狐
2012/09/03
179
0
linux c/c++面试知识点整理(二)

11、关联、聚合、组合的区别 主要是在画uml类图时,有关联、聚合和组合的说法。 关联,是一种很弱的联系,指的是两个类之间有某种联系,比如一个类实例作为另一个类方法的参数; 聚合,指的是...

晟夏的叶
2017/04/23
0
0
类与类关系的UML图与代码表现

类与类之间的关系对于理解面向对象具有很重要的作用,以前在面试的时候也经常被问到这个问题,在这里我就介绍一下。 类与类之间存在以下关系: (1)泛化(Generalization) (2)关联(Association)...

长平狐
2012/10/09
92
0
UML类图(Class Diagram)中类与类之间的关系及表示方式

类之间大体分为5种关系: 1,依赖关系(Dependency) 单向,表示一个类依赖于另一个类的定义,其中一个类的变化将影响另外一个类,是一种“use a”关系 如果A依赖于B,则B表现为A的局部变量,方...

一零贰IV
2018/05/12
177
0
uml类图(Class Diagram)中类与类之间的关系及表示方式

类之间大体分为5种关系: 1,依赖关系(Dependency) 单向,表示一个类依赖于另一个类的定义,其中一个类的变化将影响另外一个类,是一种“use a”关系 如果A依赖于B,则B表现为A的局部变量,方...

满风
2018/03/09
128
0

没有更多内容

加载失败,请刷新页面

加载更多

单例的创建以及常见的几种实现模式

单例是用来干嘛的? 1.一种设计模式, 2.一般都是资源类,如数据库连接池等, 3.但是要保证一个类仅有一个实例,并提供一个访问它的全局访问点。(只能提供私有的构造器,即保证不能随意创建该...

费先森
17分钟前
19
0
【Seata微服务分布式事务】2. Seata微服务分布式事务项目搭建

引依赖 <!--seata--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><exclusions><exclusion>......

贺小康
26分钟前
13
0
这四个问题场景你会排查原因吗?看看高手是如何使用 Arthas 快速定位原因的!

作者 | [张奇(司楚)] 当线上碰到头疼的问题时,还在对着代码一行行的看?真的不太时髦了啊喂~ 俗话说的好 “问题排查不用愁,Arthas 来帮您忙。” 今天就来说说这个让妈妈再也不用担心我排查...

阿里巴巴云原生
27分钟前
26
0
创龙TI TMS320C6748(定点/浮点DSP C674x)的SATA硬盘接口、RJ45以太网口

TMS320C6748 TI TMS320C6748是一款低功耗浮点DSP处理器。支持DSP的高数字信号处理性能和精简指令计算机(RISC)技术,采用一个高性能的456MHz TMS320C674x 32位处理器。以下是TMS320C6748 C...

Tronlong创龙
29分钟前
23
0
mp3格式转换器怎么用?这有高效转换音频格式的方法

mp3格式转换器怎么用?mp3格式是众多音频格式中的其中一种,相比于其他m4a、ogg和aac等格式是更为常见的一种。也正因此mp3有更加高的兼容性,所以很多小伙伴获得别的音频文件时会选择第一时间...

cenfeng123
29分钟前
22
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部