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-5 覆写基类的虚方法
当覆写基类的虚方法时,覆写方法必须与被覆写的虚方法具有相同的方法签名。Visual Studio的IntelliSense功能可以帮助我们更方便地覆写基类的虚方法。我们在派生类中书写方法声明代码时,输入override关键字以后,聪明的IntelliSense就知道我们想要覆写基类的方法,基类中可被覆写的方法(不止是虚方法,也可以是其他覆写方法,稍后会讲到)随即显示出来,供我们选择,如图11-6所示。
图 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方法输出结果为:
说中国话……
说英语……
综上所述:基类可以将方法声明为虚方法,以允许派生类对它进行覆写,以扩展(改变或者增强)基类的功能。