1、接口。   

     1)接口描述的是可属于任何类或结构的一组相关功能,所以实现接口的类或结构必须实现接口定义中指定的接口成员。
2)接口使用interface 关键字进行定义,可由方法、属性、事件、索引器或这四种成员类型的任意组合构成。



2、接口的特性。
     1)接口类似于抽象基类,不能直接实例化接口;接口中的方法都是抽象方法,实现接口的任何非抽象类型都必须实现接口的所有成员。     
     2)接口不能包含常量、字段、运算符、实例构造函数、析构函数或类型、不能包含静态成员。
     3)接口成员是自动公开的,且不能包含任何访问修饰符。
     4)接口自身可从多个接口继承,类和结构可继承多个接口,但接口不能继承类。

interface IProgram 
 
      { 
 
          void Fun(); 
 
      } 
 
      class Program:IProgram 
 
      { 
 
           //显式实现接口成员 
 
          void IProgram。Fun() 
 
          { 
 
              Console.WriteLine("I am Fun."); 
 
          } 
 
          staticvoid Main(string[] args) 
 
          { 
 
              IProgram p =new Program();  //声明一个接口实例,但不是对接口进行实例化 
 
              p.Fun(); 
 
              Console.Read(); 
 
          } 
 
      }


3、实现接口可以显式实现和隐式实现,那么这两种实现到底有什么优缺点呢?
     1)一般情况,当类或者结构要实现的是单个接口,可以使用隐式实现。
     2)如果类或者结构继承了多个接口且接口中具有相同名称成员时,就要用到显式实现,当显式实现方式存在时,隐式实现方式就失效了。

interface IProgram 
 
      { 
 
          void Fun(); 
 
      } 
 
      interface IAProgram 
 
      { 
 
          void Fun(); 
 
      } 
 
      class Program : IProgram, IAProgram 
 
      { 
 
          void IProgram.Fun()  //显式实现接口IProgram 
 
          { 
 
              Console.WriteLine("I am IProgram Fun."); 
 
          } 
 
          void IAProgram.Fun()  //显式实现接口IAProgram 
 
          { 
 
              Console.WriteLine("I am IAProgram Fun."); 
 
          } 
 
          //public void Fun()   //隐式实现接口 
 
          //{ 
 
          //    Console.WriteLine("I am Program Fun."); 
 
          //} 
 
          staticvoid Main(string[] args) 
 
          {   
 
              //IProgram p = new Program(); 
 
              //p.Fun(); 
 
              //IAProgram ap = new Program(); 
 
              //ap.Fun(); 
 
              Program pro =new Program(); 
 
              ((IProgram)pro).Fun(); 
 
              ((IAProgram)pro).Fun(); 
 
              Console.Read(); 
 
              } 
 
      }


4、接口的继承。
     1)接口继承和类继承不同:首先,类继承不仅是说明继承,而且也是实现继承;而接口继承只是说明继承。
     2)也就是说,派生类可以继承基类的方法实现,而派生的接口只继承了父接口的成员方法说明,而没有继承父接口的实现,
     3)其次,C#中类继承只允许单继承,但是接口继承允许多继承,一个子接口可以有多个父接口。

interface IProgram 
 
      { 
 
          void Fun(); 
 
      } 
 
      interface IAProgram:IProgram{} 
 
      class Program :  IAProgram 
 
      { 
 
         void IProgram.Fun() 
 
          { 
 
              Console.WriteLine("I am IProgram Fun."); 
 
          } 
 
         staticvoid Main(string[] args) 
 
         { 
 
              Program pro =new Program(); 
 
              ((IAProgram)pro).Fun(); 
 
          } 
 
      }


5、接口的覆盖:由于接口的实现没有方法体,抽象方法也没有方法体,那么当我们在接口的实现方法里调用抽象方法时,会如何执行呢?
     结果是:抽象类子类的实现方法功能

interface IProgram 
 
      { 
 
          void Fun(); 
 
      } 
 
      abstract  class AProgram : IProgram 
 
      { 
 
          public abstract void AFun(); 
 
          void IProgram.Fun() 
 
          { 
 
              AFun(); 
 
          } 
 
      } 
 
      class Program:AProgram 
 
      { 
 
          public override void AFun() 
 
          { 
 
              Console.WriteLine("I am AProgram."); 
 
          } 
 
          staticvoid Main(string[] args) 
 
          { 
 
              IProgram pro =new Program(); 
 
              pro.Fun(); 
 
          } 
 
      }


6、接口和抽象类的区别。
     1)接口用于规范,抽象类用于共性。
     2)接口中只能声明方法,属性,事件,索引器。而抽象类中可以有方法的实现,也可以定义非静态的类变量。
     3)抽象类是类,所以只能被单继承,但是接口却可以一次实现多个。
     4)抽象类可以提供某些方法的部分实现,接口不可以。
     5)抽象类的实例是它的子类给出的。接口的实例是实现接口的类给出的
     6)在抽象类中加入一个方法,那么它的子类就同时有了这个方法。而在接口中加入新的方法,那么实现它的类就要重新编写(这就是为什么说接口是一个类的规范了)。
7)接口成员被定义为公共的,但抽象类的成员也可以是私有的、受保护的、内部的或受保护的内部成员(其中受保护的内部成员只能在应用程序的代码或派生类中访问)。
     8)此外接口不能包含字段、构造函数、析构函数、静态成员或常量。