原本打算抽象类和接口一起讲的,但是抽象类也属于多态的章节,而多态又是C#中很重要的部分,所以我觉得还是抽象类和多态一起讲吧。

虚方法与覆写方法(virtual)

虚方法可以使基类的引用访问升至派生类内。
基类的方法用virtual标注。
派生类的方法用override标注。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Program {
static void Main(string[] args) {
Human human = new Man();
human.Eat();//我可以吃方便面
}
}
class Human {
virtual public void Eat() {
Console.WriteLine("我可以吃饭");
}
}
class Man : Human {
override public void Eat() {
Console.WriteLine("我可以吃方便面");
}
}

覆写和被覆写的方法必须有相同的可访问性。
不能复写static方法和非虚方法。
方法、属性、索引器、事件都可以声明virtual和override。
方法的调用被沿着派生层次上溯之中,一直到标记为override的方法的最高派生版本。

抽象(abstract)

抽象成员指的是必须被覆写的函数成员用abstract,与虚拟成员不同,虚拟成员是可以被覆写抽象成员则是必须被复写,两者都只能覆写函数成员且虚拟成员和抽象成员都不能是私有的。
有了abstract就不能写virtual了。
含有抽象成员的类被称为抽象类,抽象类只能被用作其他类的基类不能创建实例,被abstract修饰。
派生类中的抽象成员必须指定override修饰符,除非这个派生类也是抽象类

1
2
3
4
5
6
7
8
abstract class Animal {
abstract protected void Use();
}
class Human : Animal {
override protected void Use() {
Console.WriteLine("我可以生火和制造工具");
}
}

抽象类常用来解耦,抽象类的进一步抽象便是接口。

密封类(sealed)

密封类不能用作基类。

1
sealed class Human{...}

静态类(static)

静态类中所有成员都是静态的。
可以有一个静态构造函数但是不能有实例构造函数,因为静态类不能创建实例。
不能继承静态类。
常用的静态类比如Math类:

1
2
Console.WriteLine(Math.Max(12,99));
Console.WriteLine(Math.Round(12.567));

静态类常用来做扩展方法:
扩展方法是Linq中常用的方法,用来给类增加静态方法和实例方法,以下是int类型的扩展方法演示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Program {
static void Main(string[] args) {
int a = 3;
if (a.Max(4)||) {
Console.WriteLine("a更大");
}
else{
Console.WriteLine("a更小");
}
}
}
public static class ExtendInt {
public static bool Max(this int a,int b) {
return a > b ? true : false;
}
}

必须包裹在一个静态类中,拓展方法必须是静态的,拓展方法必须包含关键字this作为它的第一个参数类型,并在后面跟着它拓展的类的名称。
扩展方法同时扩展了静态方法和实例方法,如果想静态调用,则第一个参数应为拓展类型的实例。