1.9 抽象类与接口
抽象类可以定义非抽象成员,这些成员被其派生类继承;抽象类的不能被实例化
非抽象类不能定义抽象成员
接口与抽象类的区别:【参考之前博文类与对象学习小结】
接口是一种类型,不提供任何实现的代码,没有构造函数,接口定义的方法是不带任何访问关键字的
抽象类的是类的一种,可以定义非抽象成员和构造函数,成员具有访问属性
不允许一个类同时提供对多个基类 的实现;但允许一个接口同时实现多个接口
实现接口时,必须对接口提供对接口所有成员的实现
接口的显式实现
在实际的开发过程中,如果多个接口定义命名的成员,而这些接口又同时被同一个类实现,此时为了避免成员之间的冲突,需提供对接口的显式实现,在方法调用时,只能通过定义接口进行调用;通过实现类对象无法进行调用,除非将其强制转化为对应的接口。
1.10 拓展方法
在不继承的前提下,对现有类型进行拓展;拓展方法定义在静态类中的静态方法
//拓展方法的定义 public static class stringExt//静态类,静态成员 { //将字符串转化为空格分开的字符串 public static string SplitSpace(this string str) { return string.Join(" ", str.ToCharArray()); } //将数值转化为其绝对值 public static int abs(this int num) { return num >= 0 ? num : 0 - num; } }
调用拓展方法
string str = "Ray"; Console.WriteLine(str.SplitSpace()); //并不会对str的值产生任何影响,只是产生了一个新的空格分割字符串 int num = -10; Console.WriteLine(num.abs().ToString());
1.11 委托与事件
类似于C语言中的函数指针,C#也可以将函数当作方法传给其他方法
定义委托与定义其他方法类似,不过需要使用关键字delagate关键字
委托类型的隐含公共基类:System.Delagate和System.MulticastDelegate(多播委托);多播委托被调用,会调用与之关联的所有方法;
当将委托当作参数传递某个方法时,是值类型的传递;在方法内部对引用的委托实例进行变更时,并不会反应到原来的委托实例中
可以总结出委托使用的三个关键点:定义委托,委托实例化,委托调用
事件是委托类型,要声明事件就需要定义事件封装类型的委托;然后在类中使用event关键字,同时为了让派生类可以重写该事件,常将其定义为protected类型。习惯上,事件的命名方式为On<事件名>
以学生听到铃声就知道是下课为例,说明事件与委托的关系:铃声响,代表事件发生;学生知道下课就是对事件的响应
标准事件与委托
更为详细的分析见博文委托与事件
1.12 枚举类型
使用枚举类型的好处:
避免意外的调用,调用者只能在给定的值当中做出选择;
可读性强,调用可以方便的识别各枚举值代表的含义
枚举类型继承自Enum类,该类是ValueType类型的派生类,可知枚举类型属于值类型
enum week { mondey,friday,sonday }
枚举类型的基础类型为int,默认从0开始,后值在前值基础上+1
var myWeek = Enum.GetValues(typeof(week));//获取枚举类型中的所有值到一个对应类型的数组中 string name = Enum.GetName(typeof(week), 2);//sonday string names = Enum.GetNames(typeof(week));//所有项
1.13 数组
声明与赋值
//先声明后赋值 type[] arr = new type[count]; arr[0] = value1; arr[1] = value2; //声明同时赋值 type[] arr = new type[] {valueList}; type[] arr = {valueType}; //二维数组 type[,] arr = new type[rowCount, colCount]; arr[0,0] = value00; arr[0,1] = value01;
数组遍历
for(int i = 0; i < arr.Count; i++) { Console.Writeline(arr[i].ToString()); } //所有数组继承自IEnumerable,可以使用foreach遍历 foreach(type var in arr) { Console.Writeline(var.ToString()); }
上述第二组方法需要用到Predicate委托,原型如下:
T为参数类型,obj为数组中待查找元素应满足条件的方法名
private static bool findProc(T obj) { if(条件一) { //处理代码1 return ture; } if(条件二) { //处理代码2 return false; } }