2017-3-15
接口:
当我们在程序设计的时候,基类中的所有方法都不用去实现,就可以使用接口来代替类,提高延展性。
格式:interface接口名{
方法的声明:不需要public和其他修饰符,默认是public
};
接口只能被实现,不能实例化。
当类实现接口时,必须将接口当中所有的方法全部实现。
实现的方法必须加修饰符public
接口可以多实现,在一定程度上弥补了类不能多继承的缺陷,实现多个接口,接口之间使用逗号隔开。
类B实现接口A,类B派生出类C,此时类C可以不实现接口A,因为他的基类B已经做了实现。
抽象类一样可以实现接口,当接口中的方法在抽象类中:
-不是抽象方法的时候就必须要实现
-当使用关键字abstract修饰方法的时候可以不实现,让继承抽象类的派生类来实现
接口之间也可以继承:
例:接口A继承于接口B,类C如果实现了A就必须将接口A和接口B里面所有的方法都实现。
泛型
使用泛型类型可以最大限度的重用代码,保护类型的安全和提高性能
降低了强制转换或装箱操作的成本或风险
可以对泛型类进行约束以访问特定数据类型的方法
装箱:值类型包装成引用类型的过程,称之为装箱。
拆箱:将引用类型转换为值类型的过程称之为拆箱。拆箱将对对象强制转换为原来的类型,将前面的对象进行拆箱。
泛型方法:当方法当中参数类型不确定的时候就使用泛型方法
修饰符 返回值类型 方法名 <T> (参数列表){};
T也可以用其他字母代替,习惯性将泛型类型写成T
泛型方法调用:方法名 (实参)
注意:泛型具体类型可以不指明,但一定要与实参的类型对应
泛型类:
格式:class+类名+<泛型> {};
实例化:类名+<具体类型>对象名= new类名<具体类型>();
运算符:+ - * /不能用在泛型类型
泛型参数的限定:使用where关键字
1.where T:struct -表示泛型T是值类型
2.Where T:class -表示泛型T是引用类型
3.Where T:new() 表示泛型具有一个无参数的构造方法
意思就是传进来的这个类必须要有默认构造
如果有多个限制,new()必须放在最后
4.where T:类名Name 表示这个泛型是Name的本类或派生类
5.Where T:接口名InterfaceName 表示泛型是实现了接口InterfaceName的类型
6.多个泛型的泛型限定
Public class Student<T,M>
Where T:InterfaceName
Where M:class{}
在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。如果客户端代码尝试用某个约束所不允许的类型来实例化类,则会产生编译时的错误,这些限制称为约束。约束是使用where上下文关键字指定的。
泛型类封装不是特定于具体数据类型的操作。泛型类最常用于集合。像从集合中添加和移除项这样的操作都以大体上相同的方式执行,与所存储的数据类型无关。