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

use*_*358 38 c# oop

我试图确认我对代码对于关联,聚合和组合的看法.所以这里..

聚合:Has-a.它具有另一种类型的现有对象

public class Aggregation
{
    SomeUtilityClass objSC
    public void doSomething(SomeUtilityClass obj)
    {
      objSC = obj;
    }
}
Run Code Online (Sandbox Code Playgroud)

构成:由另一个对象组成

public class Composition
{
    SomeUtilityClass objSC = new SomeUtilityClass();
    public void doSomething()
    {
        objSC.someMethod();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

    public class Association
    {
        //SomeUtilityClass objSC   /*NO local reference maintained */
        public void doSomething(SomeUtilityClass obj)
        {
           obj.DoSomething();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

我的理解是否正确?我在这里这里读过相互矛盾的文章,所以我真的不确定应该遵循哪一条.我的理解似乎与第一个链接一致.我觉得第二个环节是错误的,或者也许我没有理解它.

你怎么看?

And*_*xei 56

对于两个对象Foo,Bar我们有:

相关性:

class Foo
{
    ...
    fooMethod(Bar bar){}
    ...
}
Run Code Online (Sandbox Code Playgroud)

协会:

class Foo
{
    private Bar bar;
    ...
}
Run Code Online (Sandbox Code Playgroud)

成分:(当它Foo死的时候Bar)

class Foo
{
    ...
    private Bar bar = new Bar();
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

class Foo 
{
    private List<Bar> bars;
}
Run Code Online (Sandbox Code Playgroud)

  • 关联样本与聚合样本的多样性不同!Bar vs List&lt;Bar&gt;,那么你的意思是与多个对象引用的关联是聚合吗? (2认同)

Tud*_*dor 22

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

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

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

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

  • @ user20358:关联通常被定义为在另一个对象上调用方法.如果你保留不参考,那没关系.从技术上讲,你可以在没有关联的情况下进行聚合:只需保留一些对象,但不要将它们用于任 :d (3认同)