第6篇 接口
接口是C#的一种引用数据类型。接口像是一个抽象类,可以定义方法成员,属性,索引器和事件等,但是接口不提供对成员的实现,继承接口的类必须提供接口成员的实现。
类用于描述的是事物的共性基本功能,接口用于定义的都是事物的额外功能。
一 接口的好处
规范性:定义接口像是在定义一种规范,当一个项目庞大复杂的时候,用接口去定义业务规范,这些接口可以用来告诉开发人员需要实现哪些具体的业务功能,并且连命名也被定义好了(可以防止开发人员任意取名)。
多继承:多继承的好处是可以让子类具备更多的功能,但是多继承的弊端是调用的不确定性。当A类和B类都有相同的Method()方法时候,C类如果同时继承A类和B类,此时C类的实例化对象在调用Method()方法时就会调用不确定。所以C#不直接支持多继承,而是通过接口来解决问题,将多继承转换成了多实现。
解耦和扩展:接口不需要管每个功能的具体实现,实现由派生类去做。面向接口的编程将接口与实现分离,实现了接口的类便具备了接口定义的功能,提高了软件的扩展性。
多态性:多态是指父类的引用类型变量指向了子类的对象或者是接口类型的引用类型变量指向了接口实现类的对象。实现面向接口编程下的多态:接口 变量 = new 接口实现类的对象。
二 接口的定义与实现
声明接口使用interface关键字,接口成员可以是属性,方法,索引器和事件,不能包含字段和构造函数等。所有的接口都隐式地具有public访问修饰符。
C#中实现接口与继承基类的形式一样,直接在实现类后面跟上冒号和接口即可(java语言则是用implements关键字)。
三 接口的特点
- 接口不可以实例化,接口是用来被实现的。
- 需要覆盖了接口中所有的成员的子类,才可以实例化。
- 一个类继承另一个类同时,还可以实现多个接口。
四 关于接口的继承与实现的关系
类与类之间是继承关系,只能单继承;类与接口之间是实现关系,而且可以多实现;接口与接口之间是继承关系,而且接口之间是多继承。
因此我们讲C#不直接支持多继承,但并不是讲C#没有多继承,因为接口就是可以多继承。
五 接口的问题。
当我们某个实现类只需要接口中的部分功能,但是为了实例化,必须要全部覆盖,这使得代码的复用性很差,怎么办?
为了方便创建接口的子类对象,可以用一个类先把接口中的所有方法都实现(空实现),该类创建对象没有意义,并且它必须要被继承,因为接口需方法要实现,所以将该类抽象。这就是传说中的没有抽象方法的抽象类。如此以来,可以用子类去继承抽象类,在覆盖掉自己需要实现的方法即可。
六 抽象类与接口的区别
- C#支持单继承,不直接支持多继承。它们的派生类只能继承一个抽象类,但是可以实现多个接口。即单继承,多实现。
- 抽象类中可以包含字段,构造函数,析构函数,静态成员或者常量等,但是接口中不可以。
- 抽象类中可以定义非抽象成员的实现,但是接口中不能定义任何实现。
- 抽象类中的成员可以私有的(只要是不抽象的),受保护的,内部的或者受保护的内部成员,但是接口中的成员必须是公共的。
备注:关于多态的内容请看“第7篇 多态”