C# 读书笔记之访问虚方法、重写方法和隐藏方法

王朝学院·作者佚名  2016-05-16
窄屏简体版  字體: 小  |  中  |  大  |  超大  

C# 读书笔记之访问虚方法、重写方法和隐藏方法C#允许派生类中的方法与基类中方法具有相同的签名:基类中使用关键字virtual定义虚方法;然后派生类中使用关键字override来重写方法,或使用关键字new来覆盖方法(隐藏方法)。

重写方法用相同的签名重写所继承的虚方法。虚方法声明用于引入新方法,而重写方法或隐藏方法声明则是用于使现有的继承虚方法专用化(通过提供该方法的新实现)

注意:如果签名相同的方法在基类和派生类都进行了声明,但该方法没有声明为virtual和override/new,则派生类方法就会隐藏基类方法,但系统编译时会产生警告信息。因为隐藏方法会存在为给定类的实例调用错误方法的危险,故应该显示地定义隐藏方法。

调用虚方法时,将首先检查该对象的运行时类型,并调用派生类中的该重写成员。如果没有派生类重写该成员,则调用其原始数据。

默认情况下,C#方法是非虚拟的。不能重写非虚方法,重写非虚方法将导致编译错误。

除了类方法外,还可以使用virtual关键字其他类成员以定义虚成员,包括属性【无参属性】、索引器【含参属性】或事件声明。虚拟成员的实现可在派生类使用关键字override来重写;或使用关键字new来覆盖。

注意:virtual 修饰符不能与static、abstract、PRivate或override修饰符一起使用。

例:

虚方法,重写方法和隐藏方法示例:Dimensions类包含x,y两个坐标和Area()虚方法。Dimensions类的派生类(Circle、Cylinder和Sphere)均重写了基类的虚方法Area()以实现不同图形表面积的计算。调用虚方法Area()时,将根据此方法关联的运行时对象调用适当的Area()实现,为每个图形计算并显示适当的面积。

1: namespace Consoleapplication2

2: {

3:

4:

5:

6: public class Dimensions

7: {

8:

9: public const double PI = Math.PI;

10: protected double x, y;

11: public Dimensions()

12: {

13:

14: }

15:

16: public Dimensions(double x, double y)

17: {

18: this.x = x;

19: this.y = y;

20: }

21:

22: public virtual double Area()

23: {

24: return x * y;

25: }

26:

27: }

28:

29: public class Circle : Dimensions //派生类:圆

30: {

31: public Circle(double r)

32: : base(r, 0)

33: {

34:

35: }

36:

37: public override double Area()

38: {

39: //园的面积

40: return PI * x * x;

41: }

42: }

43: public class Sphere : Dimensions //派生类:球体

44: {

45: public Sphere(double r)

46: : base(r, 0)

47: {

48:

49: }

50:

51: public override double Area()

52: {

53: //球体的表面积

54: return 4 * PI * x * x;

55: }

56: }

57: public class Cylinder : Dimensions //派生类:圆柱体

58: {

59: public Cylinder(double r)

60: : base(r, 0)

61: {

62:

63: }

64:

65: public override double Area()

66: {

67: //圆柱体的表面积

68: return 2 * PI * x * x + 2 * PI * x * y;

69: }

70: }

71:

72: public class Program

73: {

74:

75:

76: static void Main(string[] args)

77: {

78: double r = 3.0, h = 5.0;

79: Dimensions c = new Circle(r); //圆

80:

81: Dimensions s = new Sphere(r); //球体

82:

83:

84: Dimensions l = new Cylinder(r); //圆柱体

85:

86: //显示各种不同形状的表面积

87:

88: Console.WriteLine("圆的面积={0:f2}",c.Area());

89: Console.WriteLine("球体的面积={0:f2}", s.Area());

90: Console.WriteLine("圆柱体的面积={0:f2}", l.Area());

91: Console.ReadKey();

92: }

93: }

94: }

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航