温习static,sealed,abstract,virtual对比:
static | sealed | abstract | virtual | |
修饰类可否 | y(c#2.0以后) | y | y | - |
修饰类可否 实例化 | x | y | x | - |
修饰类可否 派生 有实例成员 | x | x | y | - |
修饰类可否 有static成员 | y | y | y | - |
修饰类可否 有virtual成员 | x | x | y | - |
修饰类可否 有abstract成员 | x | x | y | - |
修饰成员可否 | y | x | y | y |
用途 | 不变和常用的工具类工具方法 | 很具体清晰不需要再被继承细化的类,或需要上下文参数的工具类 | 较抽象的基类,强制实现其抽象方法 | 可以再被进一步扩展的虚方法,但非强制 |
1、虚方法与抽象方法:虚方法有方法体实现代码,抽象方法只有声明;
2、虚方法与普通方法:虚方法可以在子类中override,普通方法不行;
3、重写虚方法和抽象方法用override;覆盖重写普通方法只能用new,仍可以在用base.方法名调用其父类被覆盖的方法;
4、调用基类方法用base.xxx,调用自身方法用this.xxx;
5、私有构造函数可阻止类被实例化;(在单例模式中使用??)
6、静态构造函数,在第一个实例或引用任何第一个静态成员之前,将被自动调用;
7、可以同时存在一个普通无参构造函数和一个静态无参构造函数。