可以将类声明为抽象类。方法是在类定义中将关键字 abstract 置于关键字 class 的前面。例如:
public abstract class A
{
// Class members here.
}
抽象类不能实例化。抽象类的用途是提供多个派生类可共享的基类的公共定义。例如,类库可以定义一个作为其多个函数的参数的抽象类,并要求程序员使用该库通过创建派生类来提供自己的类实现。
抽象类也可以定义抽象方法。方法是将关键字 abstract 添加到方法的返回类型的前面。例如:
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.
}
}
如果将虚方法声明为抽象方法,则它对于从抽象类继承的所有类而言仍然是虚的。继承抽象方法的类无法访问该方法的原始实现。在前面的示例中,类 F 上的 DoWork 无法调用类 D 上的 DoWork。在此情况下,抽象类可以强制派生类为虚方法提供新的方法实现。
使用抽象类还要记住二点,一:因为抽象类中有可能存在抽象方法,也就是存在没有实现的方法,所以抽象类无法被实例化,也就是无法创建类的实例对象;二:定义抽象方法的时候,为了让继承的子类能够实现这个抽象方法,也就必须把抽象的方法定义成公有成员,这样在抽象类的外部才能访问到这个抽象方法。