5.3 接口
接口是为了实现多重继承而产生的。由于C#中的类不支持多重继承,但在客观世界中出现多重继承的情况又比较多,因此为了避免传统的多重继承给程序带来的复杂性等问题,同时又保证了多重继承带给程序员的诸多好处,因此接口显得尤为重要。本节将对接口进行详细的讲解。
5.3.1 接口的介绍及声明
在C#中使用interface声明接口,其语法格式如下:
访问修饰符 interface 接口名 { //接口成员 }
在声明接口时,除interface关键字和接口名外,其他的都是可选的。可以使用public、protected、private、new和internal等修饰符声明接口,但接口成员必须是public的。
接口可包含方法、属性、事件或索引器这4种成员类型,但不能包含字段,也不能设置这些成员的具体值,即只能定义,不能赋值。
所以,接口具有以下特性。
(1)不能直接实例化接口。
(2)接口可以包含方法、属性、事件或索引器。
(3)接口不包含方法的实现。
(4)继承接口的任何非抽象类型都必须实现接口的所有成员。
(5)类和结构以及接口本身都可以从多个接口继承。
接口成员的定义与类成员相似,但需要注意以下几点区别。
(1)接口成员不能包含代码体。
(2)接口成员不能用关键字static、abstract、virtual或sealed来定义。
(3)接口不能包含类型定义。
以下代码片段声明了一个public的名为IMyInterface的接口,并定义了一个名为ShowMsg的方法。
public interface IMyInterface { void ShowMsg(); }
5.3.2 实现接口
接口通过类的继承来实现,一个类虽然只能有一个基类,但可以继承任意多个接口,实现接口的类必须包含该接口所有成员的实现代码,同时必须匹配指定的签名,并且必须是public的。
例5-8演示了接口的实现。
例5-8:接口的实现(ConsoleInterface)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleInterface { class Program { static void Main(string[] args) { IPerson iPerson = new Chinese(); iPerson.Say(); iPerson = new American(); iPerson.Say(); Console.ReadLine(); } } public interface IPerson { void Say(); } public class Chinese : IPerson { public void Say() { Console.WriteLine("你好!"); } } public class American : IPerson { public void Say() { Console.WriteLine("Hello!"); } } }
运行结果如图5-8所示。
图5-8 接口的实现
在此例中,声明了一个名为IPerson的接口,IPerson接口中有一个Say方法。接着定义了Chinese和American两个类,并分别实现了IPerson接口,并实现了Say方法。在Main方法中,分别使用两个类的对象实例化IPerson接口,并分别调用其Say方法输出相应信息。