【问题标题】:Understanding the Aggregation, Association, Composition [duplicate]了解聚合、关联、组合
【发布时间】:2016-06-20 06:03:02
【问题描述】:

我的代码中有以下场景,想了解类之间的聚合、组合、关联关系。

1)

class A : IDisposable
{
    private B objB;

    public A(B )
    {
        objB = new B();
    }

    public void Dispose()
    {
        objB.Dispose();
    }
}

2)

class A : IDisposable
    {
        private B objB;

        public A(B objB)
        {
            this.objB = objB;
        }

        public void Dispose()
        {

        }
    }

3)

class A : IDisposable
    {
        private B objB;

        public A()
        {

        }

        public void Sample()
        {
            objB = new B();
        }

        public void Dispose()
        {
            if (objB != null)
            {
                objB.Dispose();
            }
        }
    }

4)

class A : IDisposable
    {

        public A()
        {

        }

        public void Sample()
        {
            using (B objB = new B())
            {
                //Do some operation
            }

        }

        public void Dispose()
        {

        }
    }

【问题讨论】:

    标签: c# uml


    【解决方案1】:

    简明扼要

    关联 - 有两个对象相互了解,但不会影响彼此的生命周期。

    Composition - 有两个类:ABA 类的对象 包含一个 B 类对象,并且不能逻辑上在没有类 B 的情况下创建。

    聚合 - 是“具有”关联关系的变体;聚合比关联更具体。它是一个代表部分-整体或部分关系的关联。

    在您的示例中,1 和 3 是 Compositions,因为它们包含 B 类对象。示例 4 是 Association,因为它只知道关于class Bonly使用它的对象作为局部变量。示例2是和聚合。 p>

    您可以在 wiki 中阅读更多信息 https://en.wikipedia.org/wiki/Class_diagram

    编辑:

    组合聚合之间的区别。

    组合关系:当试图表示现实世界的整体关系时,例如引擎是汽车的一部分。
    聚合关系:表示软件或数据库关系时,例如汽车模型引擎 ENG01 是汽车模型 CM01 的一部分,因为引擎 ENG01 也可能是不同汽车模型的一部分。

    在您的示例 1 中,您在 A 类中创建了 B 类对象。根据您的代码,您不能将创建的 B 类对象提供给 A 类的另一个对象。 但是在您的示例 2 中,您将对象 B 作为参数。因此您可以创建许多 A 类对象并为它们提供相同的对象 B

    【讨论】:

    • 感谢您的回答。。我对场景 1、3、4 深信不疑。但我对场景 2 有疑问。我觉得它是聚合的。请澄清
    • @ratty 是的,你是对的。2 是和聚合。我编辑我的答案
    猜你喜欢
    • 2012-07-01
    • 2016-06-27
    • 2014-11-04
    • 2014-03-24
    • 2013-01-28
    • 2013-05-14
    • 2017-06-24
    • 2012-09-18
    • 2012-11-14
    相关资源
    最近更新 更多