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.4 覆写标记为override的方法 - 图1

图 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()"是密封的,无法进行重写