4

我一直在阅读有关组合和聚合的内容。我想我了解这两种不同关系类型的基本原理。然而,它在代码中的实际外观仍不清楚。

如果您有一个复合对象,这是否意味着您永远不会new OtherObject()在正在定义的复合对象之外进行编写?您永远不会将类型的引用传递OtherObject给复合对象,它是在内部维护的吗?

在您传递引用的所有情况下,您不再处理组合而是聚合,这对吗?两者之间的界限在哪里?我不明白什么时候允许你谈论属于作品一部分的对象而不是不是的规则。

4

2 回答 2

4

作曲是一种强烈的联想。

聚合是一个关联。

聚合是关联的一种特殊情况。对象之间的方向关联。当一个对象“拥有”另一个对象时,您就可以在它们之间进行聚合。它们之间的方向指定了哪个对象包含另一个对象。

组合是聚合的一种特殊情况。在更具体的方式中,受限制的聚合称为组合。当一个对象包含另一个对象时,如果被包含的对象不存在容器对象就不能存在,则称为组合。

组合是一个关联,其中包含对象b负责被包含对象的生命周期a。如果将一个已经创建的对象的引用传递a给另一个对象b,那么是b无法控制.aab

class A {
   B b ;
   A(B b ) { this.b = b; }
 }

这里的存在b不依赖于a,但A确实包含 的对象B聚合

class A {
 B b ;
 A() { b = new B();}
}

这里b取决于对象的存在A。如果没有 的对象A,则没有任何一个的对象B作品。

于 2013-07-04T10:54:32.140 回答
0

考虑以下

这是作文的例子。B 与 A 相关联,因此没有 A 就无法存在

      Class A{
         B b = new B();
       }

如果您创建类的对象,A则 B 也将被创建,如果 A 被销毁,则 B 也将被销毁。

考虑Aggregation的例子。B 与 A 相关联,但可以在没有 A 的情况下存在

      Class A{
         C c = new C();
         B b = c.someMethodThatReturnsExistingBObject();
      }

      class C{
         B b = new B();
         public B someMethodThatReturnsExistingBObject(){
             return b;
         }
       }

那么这将返回一个具有外部引用的对象。即它仍然存在于这个类之外。因此,即使 A 对象被销毁,B 对象也将存在于外部。

在您传递引用的所有情况下,您不再处理组合而是聚合,这对吗?

是的,因为构图的意思是物体没有任何外在的存在。一旦你传递一个引用,它就会被认为是aggregation因为在传递一个引用时,你正在向它传递一个外部对象,因为它是从外部传递的,所以它会从外部存在。

于 2013-07-04T10:58:48.847 回答