名字空间与接口

名字空间与接口
1名字空间
c#程序是使用名字空间组织的﹐既以做内部组织形式﹐也可以用做外部组织形式﹐从而使程序中的变量方法供其它序调用。
         1.1编译单元
         编译单元就是一个源文件的全部结构
         1.2字空间的声明
         名字空间隐式的指定为public﹐不能包含任何访问修饰符
         ****
namespace n1.n2
         {
                 class a{} class b{}
}
*****
namespace n1
         {
                 namespace n2
                 {
                           class a{} class b{}
}
}
****
namespace n1.n2
         {
                 class a{}
}
namespace n1.n2
         {
                 class b{}
}
以上这三种的名字空间都是一致的
 
 
 
 
 
 
 
 
 
 
 
1.3using指示符
1.3.1using 别名
                   ****
namespace n1.n2
                   {
                 class a{} class b{}
}
****
namespace n3
                   {
                 using r = n1.n2.a;//r n1.n2.a的别名
                 class b : r{}    
}
注意﹐一个别名的生效不是由别名自身决定的也不是有其它别名决定的
                   ****
namespace n1.n2
                   {
                 class a{} class b{}
}
****
namespace n3
                   {
                 using r1 = n1;
                 using r2 = r1.n2;//这样是错误的﹐因为r1未知﹐r2的声明不受r1的影响    
}
1.3.2using 名字空间
****
namespace n1.n2
                   {
                 class a{}
}
****
namespace n3
                   {
                 using n1.n2;
                 class b : a{}   
}
****
 
 
 
 
注意﹐不能引进嵌套的名字空间
****
namespace n1.n2
                   {
                 class a{}
}
****
namespace n3
                   {
                 using n1;
                 class b : n2.a{} //这样是错误的﹐n2未知  
}
****
注意﹐不能产生歧义
****
namespace n1
                   {
                 class a{}
}
****
namespace n2
                   {
                 class a{}
}
****
namespace n3
                   {
                            using n1;
                 using n2;
                 class b : a{} //这样是错误的﹐a是不明确的  
}
****
上面讲的名字空间引用的问题﹐有点象变量作用域的问题﹐需要注意
 
 
 
 
 
 
 
 
 
 
2接口
接口定义了一个协议﹐执行接口的类或结构必须遵守协议﹐接口可以从多个基本接口继承﹐类和结构也可以执行多个接口。
接口可以包含方法﹑属性﹑事件和索引。接口本身不提供它定义成员的执行。接口只是指定类或执行接口的接口中的成员。
有了接口我们就可以拋开编程语言的限制﹐当然这只是理论上的﹐实现接口的类或接口要与接口的定义严格一致。
接口是重点﹐也是c#的精华所在﹐不管你能接受多少﹐但你必须应该记住两点﹕接口是一种契约﹐目的是为了跨语言编程的实现。
2.1接口声明
       [属性选择] [接口修饰语选择] interface 接口标识符 [:基础接口[,基础接口…]] {接口体}
[attributes] [modifiers] interface identifier [:base-list] {interface-body}[;]
2.1.1接口修饰语
        new public protected internal private﹐注意new只用在嵌套的接口﹐表示覆盖(隐蔽)了继承而来的同名成员﹐
      它的控制访问权限
        2.1.2基础接口
        一个接口可以从很多的接口继承﹐叫做外部的基本接口
        interface I1
        {
                 int Count {get;set;}
                   }
interface I2
                   {
       void Count(int i)
                   }
interface I3 : I1, I2 {}
一个接口直接或间接继承自己是错误的﹐一个基础接口至少可以访问接口自身
2.1.3接口体
接口体里包含了接口的成员
{
       接口成员声明
                   }
         2.2接口成员
         包括继承的基础接口成员和接口自身生成的成员。
可以声明0个或多个成员﹐接口的成员必须是方法﹑属性﹑事件或索引﹐不能包括常数﹑域﹑操作符﹑构造﹑析构﹐也不能包括任何形式的静态成员。
所有的接口成员都隐式的含有公共访问权限﹐即public﹐因此再包含其它任何修饰都是错误的。
接口的成员之间不能相互同名﹐继承而来的成员不用再定义,但接口可以定义与继承而来的成员同名的成员这时接口成员覆盖了继承而来的成员,这会导致给出一个警告﹐可以使用new明确的表示覆盖(隐藏)基本接口成员。
pblic delegate void StringListEvent(ISringList sender)
public interface ISingList
{
        void Add(string s);//方法
        int Count {get;}//属性﹐且是只读的
        event StringListEvent Changed;//事件
        string this[int index] {get;set;}//索引
}
2.3接口成员的访问
通过I.MI[A]进行成员访问和索引访问
interface IIneger
{
void Add(int i);
}
interface IDouble
{
void Add(double i);
}
interface INumber : IIneger,IDouble {}
class C
{
        void Test(INumber n)
        {
                 n.Add(1);                            //错误﹐有歧义﹐因为两个方法都可以用
                 n.Add(1.0);                //正确﹐因为只有IDouble可用
                 ((IIneger)n).Add(1);          //正确﹐因为只有Iineger 可选
                 ((IDouble)n).Add(1);          //正确﹐因为只有IDouble可选
}
}
举个隐蔽的例子
interface I1
{
void Add(int i);
}
interface I2 : I1
{
new void Add(int i);
}
interface I3 : I1
{
void test();
}
interface ITest : I2, I3 {}
class CTest{   
void test(ITest d){
                 d.Add(1);                    //调用 I2.Add﹐因为I1.Add被隐蔽了
                 ((I1)d).Add(1);           //调用 I1.Add
                 ((I2)d).Add(1);           //调用 I2.Add
                 ((I3d).Add(1);             //调用 I1.Add
        }
}
2.4完全资格接口成员名字
接口的完全资格名是这样构成的﹕接口名加点"." 再跟成员名﹐如果接口是名字空间的成员,完全资格名还必须包含名字空间的名称。
2.5接口执行
接口通过类或结构来执行﹐前面已经就接口成员举了例子﹐先面看看用类来执行接口的例子
interface ICloneable
{
Object Clone();
}
interface IComparable
{
int CompareTo(object other);
}
class ListEntry : ICloneable, IComparable
{
        void Object Clone() {…}
        public int CompareTo(object other) {…}
}
这个例子中﹐类ListEntry继承接口ICloneable, IComparable为自己的接口﹐并且实现了接口定义的两个方法﹐这种实现接口的方法是隐式的﹐可以实现接口的父接口。
2.5.1外部接口成员执行
先看下面的例子
interface ICloneable
{
Object Clone();
}
interface IComparable
{
int CompareTo(object other);
}
class ListEntry : ICloneable, IComparable
{
       Object ICloneable.Clone() {…}
       int IComparable.CompareTo(object other) {…}
}
这个例子与上面的区别是﹐接口执行直接指向了一个完全资格接口成员的名字的方法﹐这种方法实现的成员称为外部接口成员﹐这种实现接口的方法是显示的。
 
 
外部接口成员主要有两个重要的用途
1)       外部接口成员体执行不能通过类或结构的实例访问﹐这样类或结构的使用者就可以不会直接使用该接口。
2)       避免了因为接口成员之间同名而发生混淆
2.5.2继承接口执行
一样接口也可以继承﹐区别是接口只继承说明方法﹐而不包括实现。
不通过显式的实现一个接口,一个派生类不能用任何方法改变它从它的基本类继承的接口映射﹐但是,当一个接口方法被映射到一个类中的虚方法时,派生类就不可能覆盖这个虚方法并且改变接口的实现函数。
显式接口成员实现程序不能被声明为虚的﹐但是可以通过继承的类覆盖方法进行特殊的转换。
2.5.3接口的重新实现
继承了接口执行的类可以对接口进行重实现。
2.5.4接口的映射
在执行类的或结构中定位接口成员执行的过程叫做接口映射
1)       外部接口成员级别优先于其它成员
2)       private protected static成员不参加映射
后面的这些东西可能听着比较模糊﹐没关系﹐我这里只是希望你能对接口有个入门﹐知道它是做什么用的﹐大致如何使用﹐具体的细节问题请你自己回去研究。
目的是为了跨语言编程的实现
说实话写asp.net用到接口的地方并不多,我本人也很少写,只是做过几个例子, 接口本身就是比较抽象,任何没有经过自己理解的讲解都是晦涩的,我希望大家能回去看一下,做几个简单的例子,否则理解不了, 接口这个东西你做的时候你就会发现它很简单,也很好用.
你记住两点即可,接口是协议是契约是规范,目的是跨语言编程,实现C#的组件级编程语言的功能,大大的有用.
有了这个基础下周我们开讲类与结构以及面向对象编程设计
今天就到这里.
posted @ 2008-04-30 11:19  曹立松  阅读(190)  评论(0编辑  收藏  举报