11.4 覆写标记为override的方法
标记为override的方法依然可以被覆写,如代码清单11-8所示:
代码清单11-8 覆写标记为override的方法
1 using System;
2
3 namespace ProgrammingCSharp4
4{
5 class PolymorphismSample
6{
7 static void Main()
8{
9 Person p=new Chinese();
10 Welcome(p);
11
12 p=new Englishmen();
13 Welcome(p);
14
15 p=new Pekingese();
16 Welcome(p);
17}
18
19 static void Welcome(Person person)
20{
21 person.Speak();
22}
23}
24
25 class Person
26{
27 public virtual void Speak()
28{
29 Console.WriteLine(“说话……”);
30}
31}
32
33 class Chinese:Person
34{
35 public override void Speak()
36{
37 Console.WriteLine(“说中文……”);
38}
39}
40
41 class Englishmen:Person
42{
43 public override void Speak()
44{
45 Console.WriteLine(“说英语……”);
46}
47}
48
49 class Pekingese:Chinese
50{
51 public override void Speak()
52{
53 Console.WriteLine(“说北京话……”);
54}
55}
56}
图11-7演示了代码清单11-8的情况。
图 11-7 覆写基类中的覆写方法
上述代码中,Pekingese类(北京人)继承自Chinese类,它仍然可以进一步覆写Chinese类中的Speak方法,输出结果为:
说中文……
说英语……
说北京话……
如果Chinese类不想让派生类继续覆写Speak方法,则可以使用sealed关键字进行修饰,表示将Speak方法标记为密封,从而不允许派生类对它进行覆写。如代码清单11-9所示:
代码清单11-9 使用sealed关键字密封覆写方法
class Chinese:Person
{
public sealed override void Speak()
{
Console.WriteLine(“说中文……”);
}
}
如果想要覆写基类中标记为密封的方法,则会收到编译器发出的异常信息:
继承成员"ProgrammingCSharp4.Chinese.Speak()"是密封的,无法进行重写