11.3 覆写方法

要在派生类覆写基类的虚方法,要使用override关键字。接上面的例子,我们来为基类Person派生两个子类:Chinese(中国人)和Englishmen(英国人),它们分别覆写父类的Speak方法,如代码清单11-5所示。

代码清单11-5 覆写方法


class Chinese:Person

{

public override void Speak()

{

Console.WriteLine(“说中国话……”);

}

}

class Englishmen:Person

{

public override void Speak()

{

Console.WriteLine(“说英语……”);

}

}


图11-5演示了上述代码的结构。

11.3 覆写方法 - 图1

图 11-5 覆写基类的虚方法

当覆写基类的虚方法时,覆写方法必须与被覆写的虚方法具有相同的方法签名。Visual Studio的IntelliSense功能可以帮助我们更方便地覆写基类的虚方法。我们在派生类中书写方法声明代码时,输入override关键字以后,聪明的IntelliSense就知道我们想要覆写基类的方法,基类中可被覆写的方法(不止是虚方法,也可以是其他覆写方法,稍后会讲到)随即显示出来,供我们选择,如图11-6所示。

11.3 覆写方法 - 图2

图 11-6 IntelliSense帮助覆写基类的虚方法

此时,选中你要覆写的方法,按回车键即可帮我们生成方法的代码,这儿我们选择覆写Speak方法,生成的代码类似于代码清单11-6所示。

代码清单11-6 Visual Studio自动生成的覆写Speak方法的代码


public override void Speak()

{

base.Speak();//base是指向Person基类的引用的变量

}


现在,我们在基类中声明了虚方法,并且在派生类中对之进行了覆写,那么可谓万事俱备,只欠东风。要如何调用呢?如代码清单11-7所示。

代码清单11-7 调用虚方法


1 class PolymorphismSample

2{

3 static void Main()

4{

5 Person p=new Chinese();

6 Welcome(p);

7

8 p=new Englishmen();

9 Welcome(p);

10}

11

12 static void Welcome(Person person)

13{

14 person.Speak();

15}

16}


我们在PolymorphismSample类声明了一个名为Welcome的方法,接收Person类型的对象参数,因为Chinese和Englishmen都是Person类的派生类。因此,凡是能接收Person类型参数的地方也可以接收Person类型的派生类型。我们分别实例化了两个派生类型:Chinese类型和Englishmen类型,调用Speak方法输出结果为:


说中国话……

说英语……


综上所述:基类可以将方法声明为虚方法,以允许派生类对它进行覆写,以扩展(改变或者增强)基类的功能。