UML类图关系对应代码

UML图简介:

UML类图关系对应代码_第1张图片

UML图中五种关系的强弱关系:依赖<关联<聚合<组合<继承

 一 依赖关系

(一)·类图:(这些图都是EA画的,方便类图源码的生成)


                    (PS:fish类依赖于water类)(鱼依赖于水)

    (二)生成源代码

UML类图关系对应代码_第2张图片

     通过代码,我们可以看到:两个类之间并没有任何的引用关系,这也就解释了为什么依赖是UML关系中最弱的一种。

(三)思考:

虽然依赖关系很弱,可是毕竟是一种关系,那在代码中是如何体现的?

1.  Water 类是全局的,则fish类可以调用它。

2.  water类是fish类的某个方法中的变量,则fish该方法可以调用它。

    public class fish
    {
        public fish() { }
        public void Drink() {
            water a = new water();
            Console.WriteLine("我要喝实例水" );
            Console.Read();
        }
    }

3.  water类做为fish类中的方法的参数或返回值。

  public class fish
    {
        public void Eat( water b) {
            Console.WriteLine("我要吃参数水");
            Console.Read();
        }
        public water  Play() {
            water a = new water();
            return a;
        }
       
    }

注意:在表现形式b和表现形式c的情况下,做为方法的变量,参数,或返回值时,其water类的生命周期随着方法的执行结束而结束。

 二 关联关系:

      关联关系表示类之间的耦合度比依赖强。具体体现在类图生成源码中,关联关系的源类会增加目标类的属性。其包括四种:单向关联,双向关联,聚合,组合。下面分别说一下这四种关联形式在代码中的具体体现。

   (一)单向关联:

      1 ·类图:

UML类图关系对应代码_第3张图片

                                                        (PS:English类单项关联与Reading类)(英语和阅读能力关联)

     2 ·源代码:

UML类图关系对应代码_第4张图片

 

    注意:从生成的源代码中我们可以看到:在源类(English类),存在着目标类Reading类的属性。

    以上关系只是关联关系的一种,叫做——单向关联,特点是:源类知道目标类的属性和方法。但目标类并不知道源类的属性和方法。上边这个例子说道:想要知道英语的水平,它必须知道阅读能力的数据。

    (二)双向关联:

       区别于单项关联,一目了然,双向关联就是彼此知道彼此的属性和方法,在自己的类中都会有对方类的属性声明。

思考:依赖关系和关联关系的区别?

1·从是否生成类的属性来看:

    依赖关系中,源类中并没有生成目标类的属性,而在关联关系中,源类中自动生成目标类的属性,而属性又是一种更为紧密的耦合,更为长久的持有关系。所以关联关系>依赖关系。

从生命周期的角度来看:

    依赖关系中,是仅当类的方法被调用时产生 ,伴随着方法的结束而结束。

    关联关系中,是当类被实例化时产生,当类销毁时关联关系随之结束,相比于依赖关系,关联关系生命周期更长。

   (三)聚合:

类图:

UML类图关系对应代码_第5张图片

                                  (ps:woods类和tree类聚合关系)(森林和树是聚合关系)

源代码:

UML类图关系对应代码_第6张图片


    注意:空心菱形表示tree对象并不随着woods对象的创建而创建,销毁而销毁。

  (四)组合:

类图:

UML类图关系对应代码_第7张图片

                       (ps:bird类和wing类强烈的聚合关系)(鸟与翅膀)

源代码:

UML类图关系对应代码_第8张图片

 

     注意:wing类是bird类的组成部分。实心菱形表示wing对象随着bird对象的创建而创建,销毁而销毁。

    思考:聚合和组合之间的关系:

        1)生命周期不一样:聚合关系中,tree类的生命周期并不随着woods类的变化,相对于组合较弱。组合关系中,wing类的生命周期随着bird类的销毁而销毁。

        2)构造函数不一样:聚合类的构造函数中包含另一个类做为参数。即森林类(woods)的构造函数要用到树类(tree)做为参数,但tree类可以脱离森林类独立存在。组合类的构造函数中包含了另一个类的实例化,即鸟类(bird)的构造函数初始化时,先实例化翅膀类(wing),即共生存,同灭亡。

 三 泛化关系:

  (一)类图:

UML类图关系对应代码_第9张图片

                                                                      (ps:pig类继承Animal类)(猪继承动物)

  (二)源代码:

UML类图关系对应代码_第10张图片

     (三)思考:泛化和继承什么关系?

           泛化和继承是从不同角度来说的。子类继承父类,父类泛化子类。

    四 实现关系:

     (一)类图:

UML类图关系对应代码_第11张图片

                                                                    (ps:person类实现Eat接口)(人实现吃接口)

    (二)源代码:

UML类图关系对应代码_第12张图片

     (三)思考:

      可以看到子类实现父类,和类实现接口在代码中表现形式一样,那接口 和父类什么关系?接口和抽象类是什么关系?参考博客《抽象类和接口的区别》

 


你可能感兴趣的:(C#,UML,对应关系)