关联,聚合和组成之间有什么区别? 请在执行方面进行说明。
#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();
}
}