11. 接口
一、接口
1、定义:接口是指定义一组函数成员而不实现成员的引用类型。
2、组成:可由属性、方法、事件、索引器这四种成员任意组成构成。接口不能包含常量、字段、运算符、实例构造函数、析构函数,也不能包含静态成员。接口不能含实现其成员的任何代码,只能定义成员本身。
3、接口成员:接口成员是自动公开的,不能含有访问修饰符(如 public 等)。接口默认声明为 public,而类的默认声明为 private。
4、继承:
(1)类继承具有单根性(子类只能继承一个父类,不能同时继承多个父类),接口可多重继承,类和结构可继承多个接口,但接口不能继承类。父接口也称为该接口的显式基接口。
(2)不同接口(不包含派生)中允许有同名的成员,如果派生接口中对显式基接口中的成员进行重新定义时,需要使用关键字 new 。
例:
1 namespace ConsoleApplication13 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 8 } 9 } 10 11 //创建接口1 12 interface Interface1 13 { 14 //属性。由于接口不能有字段,所以属性经常被写作自动属性 15 string Name { get; set; } 16 17 //方法不能包含方法体 18 void write(); 19 } 20 21 //接口2继承接口1 22 interface Interface2:Interface1 23 { 24 //派生接口中对显式基接口中的成员进行重新定义时,需使用new 关键字 25 new void write(); 26 } 27 }
二、接口的隐式与显式实现
1、格式:
1 class Animal:IAnimal 2 { 3 //隐式实现接口成员 4 public void Dog() //这个Dog方法是在接口中定义的 5 { 6 Console.WriteLine("我是隐式实现接口的dog..."); 7 } 8 9 //显式实现接口成员(前面不能加public) 10 void IAnimal.Dog() 11 { 12 Console.WriteLine("我是显式实现接口的dog..."); 13 } 14 }
2、隐式实现接口:可以通过类调用方法调用,也可以通过接口调用方法调用
3、显式实现接口:通过接口调用方法调用,如果想通过类方法调用则必须通过强制转换
4、当显式实现方式存在时,隐式实现方式就失效了。
5、当一个类实现的多个接口中具有相同的方法时,用显式方式专门显式某个接口的方法。
例:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 //一、隐式接口实现可以通过两种调用方式 6 7 //通过类调用输出 8 Animal animal = new Animal(); 9 animal.Dog(); 10 11 //通过接口调用输出(在这里因为同时存在隐式和显式接口实现,所以隐式实现失效了) 12 IAnimal animal1 = new Animal(); 13 animal1.Dog(); 14 15 //二、显式接口实现 16 17 //通过接口调用输出 18 IAnimal animal2 = new Animal(); 19 animal2.Dog(); 20 21 //通过强制转换调用输出 22 Animal animal3 = new Animal(); 23 (animal3 as IAnimal).Dog(); 24 Console.ReadKey(); 25 } 26 } 27 28 //新建一个接口 29 interface IAnimal 30 { 31 //只能有方法定义而不能包含方法体,实现过程(方法体)必须在实现接口的类中完成 32 void Dog(); 33 } 34 35 //新建一个类实现接口的隐式与显式实现 36 class Animal:IAnimal 37 { 38 //隐式实现接口成员 39 public void Dog() 40 { 41 Console.WriteLine("我是隐式实现接口的dog..."); 42 } 43 44 //显式实现接口成员(前面不能加public) 45 void IAnimal.Dog() 46 { 47 Console.WriteLine("我是显式实现接口的dog..."); 48 } 49 }