当实例方法声明包含 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 重写该抽象方法以提供它自己的实现。
浙公网安备 33010602011771号