多态
原本打算抽象类和接口一起讲的,但是抽象类也属于多态的章节,而多态又是C#中很重要的部分,所以我觉得还是抽象类和多态一起讲吧。
虚方法与覆写方法(virtual)
虚方法可以使基类的引用访问升至派生类内。
基类的方法用virtual标注。
派生类的方法用override标注。
1 | class Program { |
覆写和被覆写的方法必须有相同的可访问性。
不能复写static方法和非虚方法。
方法、属性、索引器、事件都可以声明virtual和override。
方法的调用被沿着派生层次上溯之中,一直到标记为override的方法的最高派生版本。
抽象(abstract)
抽象成员指的是必须被覆写的函数成员用abstract,与虚拟成员不同,虚拟成员是可以被覆写抽象成员则是必须被复写,两者都只能覆写函数成员且虚拟成员和抽象成员都不能是私有的。
有了abstract就不能写virtual了。
含有抽象成员的类被称为抽象类,抽象类只能被用作其他类的基类不能创建实例,被abstract修饰。
派生类中的抽象成员必须指定override修饰符,除非这个派生类也是抽象类
1 | abstract class Animal { |
抽象类常用来解耦,抽象类的进一步抽象便是接口。
密封类(sealed)
密封类不能用作基类。
1 | sealed class Human{...} |
静态类(static)
静态类中所有成员都是静态的。
可以有一个静态构造函数但是不能有实例构造函数,因为静态类不能创建实例。
不能继承静态类。
常用的静态类比如Math类:
1 | Console.WriteLine(Math.Max(12,99)); |
静态类常用来做扩展方法:
扩展方法是Linq中常用的方法,用来给类增加静态方法和实例方法,以下是int类型的扩展方法演示。
1 | class Program { |
必须包裹在一个静态类中,拓展方法必须是静态的,拓展方法必须包含关键字this作为它的第一个参数类型,并在后面跟着它拓展的类的名称。
扩展方法同时扩展了静态方法和实例方法,如果想静态调用,则第一个参数应为拓展类型的实例。