![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
抽象类具有如下特征:
1、抽象类不能实例化,泛指一类事物。
2、抽象类可以包含抽象方法和抽象访问器。
3、不能用 sealed修饰符标示抽象类,这意味着抽象类不能被继承。
4、从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。
5、实现由一个重写方法override提供,此重写方法是非抽象类的一个成员。
6、在抽象方法声明中不能使用 static 或 virtual 修饰符。
7、除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。
8、在静态属性上不能使用 abstract 修饰符。
9、在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性。
抽象类必须为所有接口成员提供实现
实现接口的抽象类可以将接口方法映射到抽象方法上。
例如:
{
void M();
}
abstract class C: I
{
public abstract void M();
}
Virtual:用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。例如,此方法可被任何继承它的类重写。
例如:
{
return x * y;
}
备注:
1、调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。
2、默认情况下,方法是非虚拟的。不能重写非虚方法。
3、virtual 修饰符不能与 static、abstract, private 或 override 修饰符一起使用。
4、除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。
5、静态属性上不能使用 virtual 修饰符。
6、通过包括使用 override 修饰符的属性声明,可在派生类中重写虚拟继承属性。
overrride:要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用 override 修饰符。
范例:同上面第1段代码范例。
备注:
1、override 方法提供从基类继承的成员的新实现。通过 override 声明重写的方法称为重写基方法。重写的基方法必须与 override 方法具有相同的签名。
2、不能重写非虚方法或静态方法。重写的基方法必须是 virtual、abstract 或 override 的。
3、override 声明不能更改 virtual 方法的可访问性。override 方法和 virtual 方法必须具有相同的访问级别修饰符。
4、不能使用修饰符 new、static、virtual 或 abstract 来修改 override 方法。
5、重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是 virtual、abstract 或 override 的。
----------------------------------------------------------------------
总结:
C#关键字 | 类型 | 方法/属性/事件 | 常量/字段 |
abstract | 表示该类型不能构建实例 | 表示在构建派生类型的实例之前派生类型必须重写并实现这个成员 | N/a |
virual | N/a | 表示这个成员可以由派生类型重写 | N/a |
override | N/a | 表示派生类型重写了基础类型的成员 | N/a |
以上部分内容参考自微软MSDN。