接口,刚开始对于什么是接口,这个概念真的狠模糊,更不用说到底有什么用?当初一个初层面的了解是,接口能提供一个很好的嵌入点,与原来程序整合,也能更方便程序的扩展性。其实在C#里,接口是对其子类(派生类)的约束。当类继承了一个接口,则必须得实现接口里面的方法。
       接口(interface),关键字:interface,接口类名一般以大写字母“I”开头
           比如声明一个打印接口类
                          public interface IPrint
                          {
                                       string Str
                                         { get; set;}
                                       void Print();
                           }
        在接口里面需要注意的细节有很多,下面就一一介绍:
         1.在接口里面的成员的访问修饰符默认都是public,不能为其他的修饰符,但是也不需要显示指定访问修饰符,显示指定访问修饰符会出现错误的;
             就如上例的IPrint 接口中的Print()方法声明。
         2.接口是抽象的另外一种特殊实现的机制。接口里的成员都必须不能含有实现;只能在派生类(子类)中实现。
        3.在派生类(子类)中必须实现接口的所有方法成员;如上面IPrint接口,派生出一个类,则必须实现Print()方法和属性Str:
                  代码:public class Test:IPrint
                            {
                                  strng str;
                                   public string Str
                                   {
                                             get{ return str;}
                                              set{ str=value;}
                                    }
          public void Print()
                                 {
                                        Console.WriteLine("");
                                  }  
       }
         4.  可访问性不一致的问题:一个类继承另一个类,子类的可访问性要与父类的可访问性一致,或者比父类的可访问性要低。如父类IPrint的访问修饰符是internal,那么子类Test的访问修饰符必须也是internal;父类IPrint的访问修饰符是public,那么子类Test的访问修饰符可以是internal 或public 。
        5.    一个类可以从多个接口中派生。然而类不可以从多个类中派生,接口就补充了这个缺点。其实一个类可以同时继承一个类和一个或者多个接口,但是继承的类名必须在所有的接口名前。
              如public class Test: Object,IPrint{..........}
               //注:其实接口也默认从Object类中派生出来
        6.如果多个接口里有同名方法,必须添加接口名在前,并且不要声明访问修饰符,具体例子二详细介绍。
 
 
         练习代码:
例子一:
   interface ITest
    {
        void Show();
        string MyName                         //属性    一个属性的签名 在子类中也必须实现
        {
            get;
            set;
        }
                                              //接口里不能有字段,因为字段不可能是抽象的
    }
    public class MyTest : ITest              //如果一个类有多重继承,那么基类必须放在所有接口之前
    {
        string myName;
        public void Show()
        {
            Console.WriteLine("子类实现所继承接口的方法");
        }
        /// <summary>
        /// 实现接口的属性
        /// </summary>
        public string MyName                 //属性是用来封装字段的访问
        {
            get { return myName; }
            set { myName = value; }
        }
    }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
例子二:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            M mm = new M();
            mm.Show();
            //调用接口实现的两种方法
            ((IA)mm).Show();
            IB ib = mm;
            ib.Show();
            Console.Read();
        }
    }
    interface IA
    {
        void Show();
    }
    interface IB
    {
        void Show();
    }
    class M : IA, IB
    {
        /// <summary>
        /// 多义性问题,要明确实现了哪个接口的方法
        ///
        /// </summary>
        public void Show()
        {
            //这个方法并不是对所继承的接口的方法的实现,而是类本身自己的方法
            //但是如果下面两个IA.Show()和IB.Show()都不存在时,编译都会通过,其实并不是对接口的实现
            //但是如果接口有同名方法,则默认使用该方法
            Console.WriteLine("类M自己的Show方法");
        }
        //下面的实现方法,才是对所继承的接口的实现
        //多个接口的同名方法的实现,必须添加接口名在前,并且不要声明访问修饰符
        //如果多个接口的同名方法要使用相同的实现,那么不要实现下面两个方法,只是用上面的一个方法即可
        void IA.Show()
        {
            Console.WriteLine("接口IA的Show方法");
        }
        void IB.Show()
        {
            Console.WriteLine("接口IB的Show方法");
        }
    }
  
   
    interface IC<T>
    {
        void Show();
    }
}