【问题标题】:C# code for association, aggregation, composition用于关联、聚合、组合的 C# 代码
【发布时间】:2012-09-18 05:09:26
【问题描述】:

我正在尝试确认我对关联、聚合和组合的代码的理解。就这样吧。

聚合:有一个。它另一个类型的现有对象

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

我的理解正确吗?我已经阅读了相互冲突的文章 herehere,所以我真的不确定该关注哪一篇。我的理解似乎与第一个链接一致。我觉得第二个链接是错误的,或者我可能没有正确理解它。

你怎么看?

【问题讨论】:

  • 聚合和关联在我的经验中不是常用的术语。对于了解其定义的微妙之处,我不会大惊小怪。还有更多有趣的概念供您花时间研究。
  • 感谢Servy;但是我上面描述的理解正确吗?
  • @Servy 我知道这是一篇旧文章,但有时我一直在努力解决同样的问题,因为我正在自己学习。我想知道,根据您上面的评论,您建议学习哪些概念?

标签: c# oop uml class-diagram


【解决方案1】:

对于两个对象 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;
}

【讨论】:

  • 关联样本与聚合样本的多重性不同! Bar vs List,那么你的意思是任何与多个对象引用的关联都是聚合?
  • 首先聚合关联的一个特例。当您使用关联时,您只希望FooBar 之间有has-a 关系。但是如果你想要FooBar 之间的has-a + whole-part 关系,你可以使用聚合。如果您希望 FooBar 具有 has-a + whole-partcomposition /i> + 所有权 关系。
  • @AndrichiAlexei 整体关系如何影响代码?对于has-a很清楚,有一个类成员,对于所有权关系也很清楚,有一个对象创建者。
【解决方案2】:

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

  • 一个包含四个Wheel 对象的Car 对象。通常,如果您销毁汽车(通过调用某种方法来清理它),您还应该在此过程中销毁车轮,因为它们存在于车外几乎没有意义(除非您将它们移动到另一个 Car 对象) .更实际地,包装输入流的读取器对象也会在内部流自身关闭时关闭它。这是作曲
  • Person 对象包含(拥有)Radio 对象。如果Person 死了,Radio 可能会被另一个Person 继承,即它在没有原始所有者的情况下存在是有意义的。更现实地,一个包含对象的列表并不要求在释放列表本身时释放所有对象。这是聚合

编辑:阅读您的链接后,我倾向于使用第一个链接,因为它给出的解释与我的相似。

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

【讨论】:

  • @user20358:关联通常定义为调用另一个对象的方法。如果你保留一个 not 的引用也没关系。从技术上讲,您可以在没有关联的情况下进行聚合:只保留一些对象,但不要将它们用于任何事情。 :D
  • 很好的例子...非常有帮助。
【解决方案3】:

如果继承给我们'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' Address
public class Address  
{  
 . . .  
}  
public class Person  
{  
     private Address address;  
     public Person(Address address)  
     {  
         this.address = address;  
     }  
     . . .  
}  

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

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

请选择以下链接以获取未来信息:

【讨论】:

    猜你喜欢
    • 2014-11-04
    • 2012-07-01
    • 2016-06-27
    • 2011-11-03
    • 1970-01-01
    • 2014-03-24
    • 2013-01-28
    • 2013-05-14
    • 2017-06-24
    相关资源
    最近更新 更多