包图Package

引言

在windows中文件夹有什么作用? 1、 对文件进行分类管理 2、避免了命名冲突

包的作用

一个程序往往包含了很多类,那么如何管理这些类就成了一个需要解决的问题(分组机制)。

这些类可能由不同的程序员进行建立,当把这些类合并成一个大系统时,往往会产生命名冲突(类名冲突)。

包的两个作用:分组机制,命名空间。

java:包(package)

c#:命名空间(namespace)

c#中定义命名空间:

namespace 命名空间名{......}

c#中引入命名空间:

using 命名空间名;

命名空间的嵌套

程序中的命名空间就如同文件和文件夹。文件夹包含许多文件和其他文件夹,同样,命名空间也可以包含其他命名空间。


 namespace  N1
 {
      namespace N2
     {
         class  ClassA{…… }
         class  ClassB{…… }
     }
    ……
 }

程序演示:命名空间(code/space)


 namespace space1   //第一个命名空间
 {
     class DownCount  //倒数计数器
     {
         int v;
         public DownCount(int n) 
         { 
            v = n; 
         } 
         public void reset(int n) //计数器置初始值
         { 
            v = n; 
         }
         public int count()       //倒数计数方法
         {
             if (v > ) return v--;
             else return ;
         }
     }
     //在此可建立其他的类
 }


 namespace space2   //第二个命名空间
 {
     class UpCount  //正数计数器
     {
         private int v;
         public int goal;
         public UpCount(int n)  //从0至n输出
         {
             goal= n;
             v = ;
         }
         public void reset(int n)
         {
             goal = n;
             v = ;
         }
         public int count()
         {
             if (v < goal) 
                 return v++;
             else 
                 return goal;
         }
     }
     //在此可建立其他的类
 }

 using System;
 using System.Collections.Generic;
 using System.Text;
 using space1;
 using space2;
 namespace space3   //第三个命名空间
 {
     class Program
     {
         static void Main(string[] args)
         {
             
             DownCount dc = new DownCount();  //倒数计数器对象
             UpCount uc = new UpCount();       //正数计数器对象
       }
     }
 }

如果去掉using space1; using space2; 这两行应这样写: space1.DownCount dc = new space1.DownCount(10);

space2.UpCount uc = new space2.UpCount(10);

包的符号

包的内容组织

提示:一个元素只能属于一个包

包内元素的可见性

public(+): 可在其他任何包中使用 private(-): 只能在该包中使用 protected(#): 可以在该包和该包的子包中使用

包的导入

当包A将包B导入时,包A中的元素可以直接访问包B中的元素,而不必在每次使用时用完整的路径名。

导入包时应注意的几个问题

 namespace  N1
 {
    class  class A
    namespace N2
     {
        class  classB{…… }
        class  classC{…… }
      }
      namespace N3
     {
        class  classB{…… }
        class  classD{…… }
      }
    }

未导入时,应使用完全限定名: N1.N3.classD d=new N1.N3.classD();

问题1:using语句只能导入命名空间中的类型成员,不能导入命名空间中的嵌套命名空间。

 using N1
 namespace N4
     { 
        //只能使用classA
     }

问题2:在相同的命名空间中不能存在名称相同的类或命名空间;如果类或命名空间位于不同的命名空间中,它们可以具有相同的名字。

 namespace  N1
 {
    class  class A
    namespace N2
     {
        class  classB{…… }
        class  classC{…… }
      }
      namespace N3
     {
        class  classB{…… }
        class  classD{…… }
      }
    }

问题3:一个命名空间可在多个源代码文件中多次声明,但是,只要它们的完全限定名相同,就认定是同一个命名空间。

 namespace  N1
 {
    class  class A
    namespace N2
     {
        class  classB{…… }
        class  classC{…… }
      }
 }
 
 namespace  N1
 {
    namespace N3
     {
        class  classB{…… }
        class  classD{…… }
      }
    }

问题4:如果使用using语句导入的多个命名空间中包含了同名的类,则不能直接通过类型名来使用这些类,所以要使用类型的完全限定名

 using  N1.N2;    //引入N1
 using  N1.N3;    //引入N2
 namespace  N3
 {
     class N1.N2 .ClassB……
     class N1.N3 .ClassB……
 }

包图的Rose建模

1、新建包

2、向包中添加类

方法1:在"浏览器"中将已经存在的类拖到包中

方法2:在"浏览器"中新建类 方法:右击包名->new->class

3、设置类在包中的可见性 方法:在浏览器中双击类,弹出下窗,在Export Control里面选择:

4、将包拖到绘图区

5、 显示包中的元素

总结

包图的相关就介绍到这里,包图按字面意思也好理解,更像一个容器。