接口对一组方法签名进行了统一命名。
接口还能定义事件、无参属性和有参属性(C#的索引器)。这些东西本质上都是方法,它们只是语法上的简化。
接口不能定义任何构造器方法,也不能定义任何实例字段。
//--
虽然CLR允许接口定义静态方法、静态字段、常量和静态构造器,但符合CLS标准的接口绝不允许,因为有的编程语言不能定义或访问它们。C#禁止接口定义任何一种这样的静态成员。
//--
C#用 interface 关键字定义接口。要为接口指定名称和一组实例方法签名。
举例:
在CLR看来,接口定义就是类型定义。也就是说,CLR会为接口类型对象定义内部数据结构,同时可通过反射机制来查询接口类型的功能。和类型一样,接口可在文件范围中定义,也可嵌套在另一个类型中。定义接口类型时,可指定你希望的任何可见性/可访问性(public,protected,internal等)。
根据约定,接口类型名称以大写字母 I 开头,目的是方便在源代码中辨认接口类型。CLR支持泛型类型和接口中的泛型方法。
接口定义可从另一个或多个接口“继承”。加引号,是因为它并不是严格意义的继承。接口继承的工作方式并不完全和类继承一样。
我个人倾向于将接口继承看成是将其他接口的协定包括到新的接口中。例如,ICollection<T>接口定义就包含了IEnumerable<T>和IEnumerable两个接口的协定。这有下面两层含义。
1.继承ICollection<T>接口的任何类必须实现ICollection<T>,IEnumerable<T>和IEnumerable这三个接口所定义的方法。
2.任何代码在引用对象时,如果期待该对象的类型实现了ICollection<T>接口,可以认为该类型还实现了IEnumerable<T>和IEnumerable接口。