天生舞男

我喜欢谦虚的学习各种...,希望自己能坚持一辈子,因为即使一张卫生巾也是有它的作用.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

抽象方法

Posted on 2005-09-12 18:56  天生舞男  阅读(353)  评论(0编辑  收藏  举报

当实例方法声明包含 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 方法是抽象的,这是因为没有有意义的默认实现。EllipseBox 类是具体的 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 重写该抽象方法以提供它自己的实现。