一、抽象类与接口
(1)抽象类:
1、类中的方法不提供具体实现,但该类的派生类必须实现这些方法,这些方法在C#中称为抽象方法。
2、 抽象方法必须是一个没有被实现的空方法。包含抽象方法的类称为抽象类,抽象类中也可以包含非抽象方法。 因为抽象类是用来作为基类的,所以不能直接被外部程序实例化,而且也不能被密封。
3、通过关键字abstract进行标记将类声明为抽象。 不能创建抽象类的对象,但可以创建抽象类的引用。 一个abstract类可以不包含抽象方法,可以包含非抽象方法和变量。 抽象方法是虚方法的特例。 构造函数和静态方法不能是抽象的。 一个非abstract类不能包含抽象方法。 子类若要覆盖抽象类的抽象方法时,要使用override关键字。
(2)接口:
接口成员访问权限为public,但不能加访问修饰符, 接口成员不能有定义。 接口的成员必须是方法,属性,事件或索引器,不能包含常数、字段、运算符、实例构造函数、析构函数或类型。
接口和类的对比:
二、is与as运算符
is运算符:可以检查对象与类之间的关系,形式为:if ( obj is classname )…… ,可用于确定接口是否可用。
as运算符:完成的功能等价于:先用is检查,再执行对象类型转换。 如果类型不兼容,as运算返回null。
三、委托与事件(还是不太明白!!!)
(1)委托:是一种可以指向方法的引用,可以理解为一种函数指针,是类型安全的。它类似于C++中的函数指针,通过对于方法特征和返回值类型的声明,封装了具有相同特征和返回类型的方法。
使用委托需要三个步骤: 声明委托类型 ==》创建委托实例 ==》 向委托实例注册方法。
1 class Delegates 2 { 3 // 委托定义 4 public delegate int Call(int n1, int n2); 5 class Math 6 { 7 // 乘法方法 8 public int Multiply(int n1, int n2) 9 { 10 return n1*n2; 11 } 12 13 // 除法方法 14 public int Divide(int n1, int n2) 15 { 16 if(n2!=0) 17 return n1/n2; 18 else{ 19 Console.WriteLine("除数不能为零!"); 20 return -999999999; 21 } 22 } 23 } 24 25 static void Main(string[] args) 26 { 27 // 委托的对象 28 Call objCall; 29 // Math 类的对象 30 Math objMath = new Math(); 31 // 将方法与委托关联起来 32 objCall = new Call(objMath.Multiply); 33 // 将委托实例化 34 int result = objCall(4, 3); 35 System.Console.WriteLine("结果为 {0}", result); 36 } 37 }
(2)事件:语法——[访问修饰符] event 委托名 事件名;