我试图确认我对代码的关联,聚合和组成。所以这里..
汇总:Has-a。它具有另一种类型的现有对象
public class Aggregation { SomeUtilityClass objSC public void doSomething(SomeUtilityClass obj) { objSC = obj; } }
作文:由另一个对象组成
public class Composition { SomeUtilityClass objSC = new SomeUtilityClass(); public void doSomething() { objSC.someMethod(); } }
协会:我有两个意见。
>当一个类与另一个类相关联时。因此,以上都是关联的例子。
>关联是一种较弱的聚合形式,其中类不会引用它接收到的对象。
public class Association { //SomeUtilityClass objSC /*NO local reference maintained */ public void doSomething(SomeUtilityClass obj) { obj.DoSomething(); } }
我的理解是正确的吗?我已经阅读了相互矛盾的文章here和here,所以我真的不确定哪一个要遵循。我的理解似乎符合第一个环节。我觉得第二个链接是错误的,或者也许我没有理解它。
你怎么看?
聚合和组合之间的区别是相当模糊的,并且AFAIK与容器被破坏后的“小孩”对象的逻辑存在有关。因此,在集合的情况下,在容器对象被破坏之后,容器中的对象仍然可以存在,而在组合设计的情况下,它们也被消除。一些类比:
> Car对象包含四个Wheel对象。通常,如果你摧毁了汽车(通过调用一些方法来清理它),你也应该在这个过程中摧毁车轮,因为它们不在车外存在(除非你把它们移动到另一个车辆对象)。更实际地,包装输入流的读取器对象也将在内部流自身关闭时关闭内部流。这是组合。
一个Person对象包含(拥有)一个Radio对象。如果该人死亡,该电台可能会被另一个人继承,即使没有原始拥有者也可以存在该电台。更实际的是,当列表本身被处理时,包含对象的列表不要求所有对象被排除。这是聚合。
编辑:阅读你的链接后,我会倾向于第一个去,因为它给出了一个类似于我的解释。