当实例方法声明包含 abstract
修饰符时,称该方法为抽象方法。虽然抽象方法同时隐含为虚拟方法,但是它不能有 virtual
修饰符。
抽象方法声明引入一个新的虚拟方法,但不提供该方法的实现。相反,非抽象类的派生类需要重写该方法以提供它们自己的实现。由于抽象方法不提供任何实际实现,因此抽象方法的方法体只包含一个分号。
只允许在抽象类中使用抽象方法声明。
在下面的示例中
public abstract class Shape { public abstract void Paint(Graphics g, Rectangle r); } public class Ellipse: Shape { public override void Paint(Graphics g, Rectangle r) { g.DrawEllipse(r); } } public class Box: Shape { public override void Paint(Graphics g, Rectangle r) { g.DrawRect(r); } }
Shape
类定义了一个可以绘制自身的几何形状对象的抽象概念。Paint
方法是抽象的,这是因为没有有意义的默认实现。Ellipse
和 Box
类是具体的 Shape
实现。由于这些类是非抽象的,因此要求它们重写 Paint
方法并提供实际实现。
若一个基访问(第 7.5.8 节)引用的是一个抽象方法,则会导致一个编译时错误。在下面的示例中
abstract class A { public abstract void F(); } class B: A { public override void F() { base.F(); // Error, base.F is abstract } }
对 base.F()
调用导致了编译时错误,原因是它引用了抽象方法。
在一个抽象方法声明中可以重写虚拟方法。这使一个抽象类可以强制从它的派生类重新实现该方法,并使该方法的原始实现不再可用。在下面的示例中
using System; class A { public virtual void F() { Console.WriteLine("A.F"); } } abstract class B: A { public abstract override void F(); } class C: B { public override void F() { Console.WriteLine("C.F"); } }
类 A
声明一个虚拟方法,类 B
用一个抽象方法重写此方法,而类 C
重写该抽象方法以提供它自己的实现。