使用 abstract 关键字能够建立不完整且必须在派生类中实现的类和类成员。程序员
使用 sealed 关键字能够防止继承之前标记为 virtual 的类或某些类成员。ide
抽象类和类成员函数
经过在类定义前面放置关键字 abstract
,能够将类声明为抽象类。 例如:优化
public abstract class A { // Class members here. }
抽象类不能实例化。 抽象类的用途是提供一个可供多个派生类共享的通用基类定义。 例如,类库能够定义一个抽象类,将其用做多个类库函数的参数,并要求使用该库的程序员经过建立派生类来提供本身的类实现。spa
抽象类也能够定义抽象方法。 方法是将关键字 abstract
添加到方法的返回类型的前面。 例如:code
public abstract class A { public abstract void DoWork(int i); }
抽象方法没有实现,因此方法定义后面是分号,而不是常规的方法块。 抽象类的派生类必须实现全部抽象方法。 当抽象类从基类继承虚方法时,抽象类能够使用抽象方法重写该虚方法。 例如:继承
// compile with: /target:library public class D { public virtual void DoWork(int i) { // Original implementation. } } public abstract class E : D { public abstract override void DoWork(int i); } public class F : E { public override void DoWork(int i) { // New implementation. } }
若是将 virtual
方法声明为 abstract
,则该方法对于从抽象类继承的全部类而言仍然是虚方法。 继承一个抽象方法的类不能访问该方法的原始实现。在上一个示例中,类 F 中的 DoWork
不能调用类 D 中的 DoWork
。 经过这种方式,抽象类能够强制派生类为虚方法提供新的方法实现。索引
密封类和类成员事件
经过在类定义前面放置关键字 sealed
,能够将类声明为密封类。 例如:get
public sealed class D { // Class members here. }
密封类不能用做基类。 所以,它也不能是抽象类。 密封类禁止派生。 因为密封类从不用做基类,因此有些运行时优化能够略微提升密封类成员的调用速度。
在对基类的虚成员进行重写的派生类上,方法、索引器、属性或事件能够将该成员声明为密封成员。 在用于之后的派生类时,这将取消成员的虚效果。 方法是在类成员声明中将 sealed
关键字置于 override 关键字的前面。 例如:
public class D : C { public sealed override void DoWork() { } }