用于关联,聚合,组合的C#代码

时间:2012-09-26 14:30:00

标签: c# oop

我正在尝试确认我对代码对于关联,聚合和&的代码的理解。组成。所以这里...... ..

聚合: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();
    }
}

协会:我对此有两种看法。

  1. 当一个班级与另一个班级相关联时。因此以上都是关联的例子。
  2. 关联是一种较弱的聚合形式,其中类不保留对其接收的对象的引用。

    public class Association
    {
        //SomeUtilityClass objSC   /*NO local reference maintained */
        public void doSomething(SomeUtilityClass obj)
        {
           obj.DoSomething();
        }
    }
    
  3. 我的理解是否正确?我阅读了有争议的文章herehere,所以我真的不确定应该遵循哪一条。我的理解似乎与第一个链接一致。我觉得第二个环节是错误的,或者也许我还没有理解它。

    你怎么看?

3 个答案:

答案 0 :(得分:54)

对于两个对象FooBar,我们有:

<强>相关性:

class Foo
{
    ...
    fooMethod(Bar bar){}
    ...
}

<强>协会

class Foo
{
    private Bar bar;
    ...
}

成分:(当Foo死亡时Bar

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

聚合:(当Foo死亡时,Bar可能会继续存在)

class Foo 
{
    private List<Bar> bars;
}

答案 1 :(得分:21)

聚合和组合之间的差异非常模糊,AFAIK与容器被销毁后“子”对象的逻辑存在有关。因此,在聚合的情况下,容器内的对象在容器对象被销毁之后仍然可以存在,而在组合设计的情况下,它们也被销毁。一些类比:

  • 包含四个Car个对象的Wheel对象。通常情况下,如果你摧毁汽车(通过调用一些方法来清理它),你也应该在过程中摧毁车轮,因为它们在车外存在是没有意义的(除非你把它们移到另一个Car宾语)。更现实地说,包装输入流的读取器对象也将在其自身关闭时关闭内部流。这是组合
  • Person对象包含(拥有)Radio个对象。如果Person死亡,Radio可能会被另一个Person继承,即在没有原始所有者的情况下存在它是有意义的。更现实地,列表保持对象不要求在放置列表本身时处理所有对象。这是聚合

编辑:在阅读完链接后,我倾向于选择第一个链接,因为它给出了类似于我的解释。

关联只是通过对该对象的引用来调用另一个对象的方法(发送消息)。

答案 2 :(得分:0)

如果继承给我们 'is-a' 而组合给我们 'part-of',我们可以说聚合给我们一个 'has-a' 关系。

==> 简而言之,关联、聚合和组合是表示对象之间关系的术语

  1. 关联:关联意味着一个对象"uses"另一个对象。正如您所说:“关联是一种较弱的聚合形式,其中类不保留对其接收的对象的引用。”
public class Association
{
    //SomeUtilityClass _obj   /*NO local reference maintained */
    public void doSomething(SomeUtilityClass obj)
    {
       obj.DoSomething();
    }
}
  1. 聚合
  • 聚合是一种特殊类型的关联。
  • 聚合是对象之间的"has-a"关系(white diamond)
  • 例如,Person 'has-a' 地址
public class Address  
{  
 . . .  
}  
public class Person  
{  
     private Address address;  
     public Person(Address address)  
     {  
         this.address = address;  
     }  
     . . .  
}  

如您所见,Person 并不管理 Address 的生命周期。如果 Person 被销毁,Address 仍然存在。

enter image description here

  1. 构成
  • 组合是一种特殊类型的聚合,它是一种强类型聚合。
  • 组合为我们提供了'part-of' 关系(dark diamond)。例如:发动机是汽车的一部分
public class Engine  
{  
 . . .   
}  
public class Car  
{  
    Engine e = new Engine();  
    .......  
}  

enter image description here

请更喜欢以下链接以获取未来信息: