接口是组件之间的协议,描述了组件对外提供的服务。从技术上讲接口是一组包含了函数型方法的数据结构。 通过这组数据结构,客户代码可以调用组件对象的功能。接口可以从父接口中继承。接口的继承首先是说明性继承,不是实现性继承,它的实现需要通过类或结构来实现;其次接口继承可以是多继承。
二.定义接口
//定义一个接口 public interface IFly { string Fly(); }
接口包含的成员有方法、属性、索引指示器和事件。由于接口允许多继承,在可能发生二义性的地方可以采用全权名来避免。可以用类来实现接口。在类中定位接口成员的实现称之为接口映射。类必须为接口的所有成员提供具体的实现,包括接口中显式定义的成员, 以及接口从父接口中继承而来的成员。同样,在对接口的实现过程中可以采用显式接口成员执行体来避免产生二义性。派生类可以对基类已经实现的接口进行重实现。
三.为什么要用接口
01.接口就是为了约束方法的格式(参数和返回值类型)而存在的 。
02.接口可以实现多继承,弥补单继承的缺陷。
03.接口可以看成是一个特殊的抽象类,通过反编译看源码可知。
04.接口中方法不用访问修饰符,因为CLR会自动添加,并且不能有方法体。
05.如果一个类实现了某个接口,就得实现该接口中所有的方法。
06.接口要谨慎使用,防止出现接口污染!
07.接口仅仅代表一种能力,实现该接口的类和接口没有继承关系。
08.接口是用来实现的,类是用来继承的。
09.其实很多时候,看似可以不用接口,因为接口就是一个方法的约定,表明你这个类必须要有某些方法,但是不写接口也可以有这些方法,用了接口,就可以使用接口变量,统一调用,实现多态。
四.抽象类和接口的区别
当需要的各个对象之间存在父子类关系时,可以考虑使用抽象类,
当各个对象之间不存在继承关系,只是有相同的能力时,而已考虑使用接口
五.使用接口实现多态的例子
Eg:
定义一个接口IFly public interface IFly { string Say(); }
定义一个Brind类实现该接口 public class Brind:Iflay { public string Say() { return "一只鸟"; } }
定义一个Plane类实现该接口 public class Plane:Iflay { public string Say() { return "一架飞机"; } }
在main方法中调用
//因为接口也是一个数据类型,所以定义一个接口类型的数组 Iflay[] iflay = { new Brind(), new Plane(), }; foreach (Iflay flay in iflay) { //每一个flay代表一个对象 Console.WriteLine(flay.Say()); } Console.ReadKey();
运行结果: