一、 委托
二、 扩展方法
三、 类型和实例
四、 泛型
泛型可以修饰:类,方法,委托等
五、 重写
**重写概念:**在父类中有一个方法,但是子类中也需要这个方法的名称,但是子类中方法的逻辑与父类中方法的逻辑不同,则需要在子类中对这个方法进行重写,重写是子类对父类的允许访问的方法的实现过程的重写,返回值和形参都不能改变。即外壳不变核心改变;
重写规则:
1、 方法名称,参数个数参数类型必须相同
2、 必须在继承里面
3、 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类;
4、 访问权限不能比父类中被重写的访问权限更低,例如:如果父类中的一个方法被声明为public,那么子类中重写该方法就不能声明为Protected;
5、 声明为static的方法不能被重写,但是能够被再次声明。
重写的前提和好处
**重写的前提:**在进行重写的时候,父类中的这个方法必须是抽象或者虚拟的;
**重写的好处:**好处在于子类可以根据需要定义特定于自己独特的行为,也就是说子类能够根据需要实现父类的方法,只是引用了父类方法的名称,但是有自己的行为,自己去实现一些方法;
六、 重载
概念:在同一个类中,方法名称相同,但是参数列表不同(参数个数,类型,顺序)称为重载。它是指我们可以定义一些名称相同的方法,通过定义不同的参数来区分这些方法,然后在调用时我们可以根据参数的类型不同选择我们所需要的;
重载特点:
1、 名称相同,参数列表不同
2、 参数个数不同,参数类型不同
3、 如果参数个数相同那么顺序一定不同
重载的作用:
1、 重载最直接的作用就是方便我们可以根据不同的参数个数,顺序,类型自动匹配方法,减少了我们写多个函数名或者方法名的重复步骤。
2、 重载的好处就是,不用为了对不同的参数类型或者参数个数,而多写一些函数。
一、泛型:
所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。
二、泛型约束:
在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。这些限制称为约束。约束是使用 where 上下文关键字指定的。
下表列出了五种类型的约束:
约束 说明
T:struct
类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。
T:class
类型参数必须是引用类型,包括任何类、接口、委托或数组类型。
T:new()
类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。
T:<基类名>
类型参数必须是指定的基类或派生自指定的基类。
T:<接口名称>
类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。
T:U
为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束.
一.派生约束
1.常见的
public class MyClass5 where T :IComparable { }
2.约束放在类的实际派生之后
public class B { }
public class MyClass6<T> : B where T : IComparable { }
3.可以继承一个基类和多个接口,且基类在接口前面
public class B { }
public class MyClass7<T> where T : B, IComparable, ICloneable { }
二.构造函数约束
1.常见的
public class MyClass8 where T : new() { }
2.可以将构造函数约束和派生约束组合起来,前提是构造函数约束出现在约束列表的最后
public class MyClass8 where T : IComparable, new() { }
三.值约束
1.常见的
public class MyClass9 where T : struct { }
2.与接口约束同时使用,在最前面(不能与基类约束,构造函数约束一起使用)
public class MyClass11 where T : struct, IComparable { }
四.引用约束
1.常见的
public class MyClass10 where T : class { }
五.多个泛型参数
public class MyClass12<T, U> where T : IComparable where U : class { }
六.继承和泛型
public class B{ }
1. 在从泛型基类派生时,可以提供类型实参,而不是基类泛型参数
public class SubClass11 : B
{ }
2.如果子类是泛型,而非具体的类型实参,则可以使用子类泛型参数作为泛型基类的指定类型
public class SubClass12 : B
{ }
3.在子类重复基类的约束(在使用子类泛型参数时,必须在子类级别重复在基类级别规定的任何约束)
public class B where T : ISomeInterface { }
public class SubClass2 : B where T : ISomeInterface { }
4.构造函数约束
复制代码
public class B where T : new()
{
public T SomeMethod()
{
return new T();
}
}
public class SubClass3 : B where T : new(){ }