聚合和关联的相同点和不同点_关联,聚合和组成之间有什么区别?

本文探讨了面向对象设计中的关联、聚合和组成的概念,通过代码示例和生活实例阐述了它们的区别。关联是对象间的普遍关系,聚合强调部分与整体的关系,而组成则涉及对象生命周期的管理,尤其是所有权。文中还提到了依赖关系和它们在对象关系中的作用。
摘要由CSDN通过智能技术生成

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

#1楼

对于两个对象, Foo和Bar可以定义关系

关联 -我与一个对象有关系。 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楼

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

//[Example:]

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

class A

{

private:

B* itsB;

};

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

//[Example:]

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

class Node

{

private:

vector itsNodes;

};

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

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

//[Example:]

//|Car|-------->|Carburetor|

class Car

{

public:

virtual ~Car() {delete itsCarb;}

private:

Carburetor* itsCarb

};

#3楼

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

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

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

在一个类的聚集和组合对象中,“拥有”另一类的对象 。

但是有细微的差别。 在《 合成 》中,属于其所属类的对象所拥有的类的对象不能独立存在 (也称为“死亡关系”)。 它始终将作为其拥有对象的一部分存在,在聚合中 ,从属对象是独立的,并且即使拥有类的对象已死也可以存在。

因此,在合成中,如果拥有对象是垃圾回收,那么拥有对象也将是垃圾回收,聚合时不是这种情况。

困惑?

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

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

总结一下-

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

#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 songs;

}

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

组成 (有+整体+所有权)

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

public class Apartment{

private Room bedroom;

public Apartment() {

bedroom = new Room();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值