接口
接口就是一个抽象类,只不过它里面只能声明抽象成员。微软认为接口就是一个规范,只说不做,那么就以为接口的成员必须由“子类”来实现,也就以为这接口中的成员必须是公共的和抽象的。
使用父类实现多态,那么实现多态的子类对象需要同一族群,所以必定会有共同属性。如果只是有共同的行为,但是却不是同一族群的时候就可以考虑使用接口。如果你仅仅想实现规范的作用---接口
构造函数是让子类来使用的,就说明你必须去实现先,但是接口中不能有任何成员的实现,所以不能有构造函数。
实现接口的成员并不是来重写,实现之后的接口成员就是类的普通成员
什么是接口对象:所谓的接口对象就是实现了接口的类的对象。
如果一个类继承自另外一个类同时实现多个接口,那么类的继承需要先确定,也就说明:如果第一个是类,那么后面的都是接口,如果第一个是接口,那么后面的都是接口。
一、语法:
[访问修饰符] interface 接口名{// 接口成员定义}接口只有方法、属性、索引和事件的声明。不能包含字段。接口是用来实现的,所有成员默认为public abstract接口的默认访问修饰符是internal接口中的成员不能有任何的实现接口中的成员不能写访问修饰符。
接口是“多继承”
由于“多继承”,无法保证方法重名的问题可以显式实现接口的成员<接口名>.方法名(){ /* 方法体 */ }显式实现的接口成员必须由接口对象来调用
二、使用接口的语法
一个类可以实现多个接口。实现接口的类,必须把接口中的所有成员都实现。子类实现接口中的成员时,不能修改成员的访问修饰符、参数列表、方法名等。(与方法重写一样)
三、接口的特点总结
1、接口是一种规范。为了多态。2、接口不能被实例化(接口是特殊抽象类,抽象类中可能有抽象方法,实例化没有意义)。3、接口中的成员不能加“访问修饰符”,接口中的成员访问修饰符为public,不能修改。(默认为public)4、接口中的成员不能有任何实现(“光说不做”,只是定义了一组未实现的成员)。5、接口中只能有方法、属性、索引器、事件,不能有“字段”。6、接口与接口之间可以继承,并且可以多继承。7、实现接口的子类必须实现该接口的全部成员。8、一个类可以同时继承一个类并实现多个接口,如果一个子类同时继承了父类A,并实现了接口IA,那么语法上A必须写在IA的前面。class MyClass:A,IA{},因为类是单继承的。9、当一个抽象类实现接口的时候,如果不想把接口中的成员实现,可以把该成员实现为abstract。10、“显示实现接口”,只能通过接口变量来调用(因为显示实现接口后成员为private)。
补充:
1、接口本质就是一个抽象类,在接口里面就是声明一系列的属性,方法,索引器和事件。从反编译工具可以看到接口是抽象类---抽象的不能实例化,只能被实现;接口是一个类,说明它也是一种数据类型,可以通过接口创建出接口对象(所谓的接口对象其实是实现该接口的类的对象)
2、创建一个接口对象,其实就是创建一个 实现了这个接口的类 的对象
3、如果某个类没有实现某个接口,那么这个这个类的对象不能强制转换为接口类型。
4、接口不要求实现接口的类有某种关联(只需要有共同的行为),也就是说不要求他们要父子继承关系,方便了用户的拓展。 父类---虚方法/抽象方法---子类重写---多态
5、在公司里面,接口更多的认为是一种规范。
6、使用接口的方式:
6.1、声明接口类型的变量,存入 实现了接口的类的 对象
6.2、以接口类型做为参数,传入 实现了接口的类的 对象
7、显示调用接口:显示实现接口的方法需要接口类型的对象才能调用。因类它默认是私有的,而且还不能人为修改为public
7.1、如果声明的类型就是接口类型,那么可直接调用
7.2、如果声明的类型是实现了接口的类的类型,那么就需要做强制转换。
8、接口解决了通过继承实现多态的三个问题:
8.1、通过继承实现多态只能是单继承,但是接口可以多实现
8.2、通过继承实现多态的类必能够提取出共同的父类,也就说明这些类之间需要有共同的特征和行为。但是接口只需要它们有共同的行为。
8.3、通过实现了继承的类做为参数传递,会传递类的对象的所有属性和方法,但是通过接口做为参数,只能调用到接口中声明的方法和属性。---更加安全