C# new和override简单描述

开发 后端
这里介绍C# new和override,重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且重写属性必须是虚拟的、抽象的或重写的。

C#语言有很多值得学习的地方,这里我们主要介绍C# new和override,包括介绍virtual 修饰符、new 修饰符等方面。

C#支持单继承,说到继承就不得不说virtual,C# new和override这三个关键词,灵活正确的使用这三个关键词,可以使程序结构更加清晰,代码重用性更高。
  
以下是msdn中对virtual,C# new和override的定义:
使用 new 修饰符显式隐藏从基类继承的成员。若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并用 new 修饰符修饰它。
virtual 关键字用于修改方法或属性的声明,在这种情况下,方法或属性被称作虚拟成员。虚拟成员的实现可由派生类中的重写成员更改。调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。默认情况下,方法是非虚拟的。不能重写非虚方法。

不能将virtual 修饰符与以下修饰符一起使用,使用 override 修饰符来修改方法、属性、索引器或事件。重写方法提供从基类继承的成员的新实现。由重写声明重写的方法称为重写基方法。重写基方法必须与重写方法具有相同的签名。不能重写非虚方法或静态方法。重写基方法必须是虚拟的、抽象的或重写的。重写声明不能更改虚方法的可访问性。重写方法和虚方法必须具有相同的访问级修饰符。
  
不能使用下列修饰符修改重写方法:
重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且重写属性必须是虚拟的、抽象的或重写的。

可以稍微归纳一下:

1. 对于基类中说明为虚的方法则必须在派生类中C# new和override(注:对于基类的虚方法,虽然你在派生类中即不new也不override,但系统还是会提示你添关键字。否则系统将视其为隐藏。我们的意思是一样的,但总觉得明明确确写上关键字还是好些)。

2. 如果用基类指针指向派生类对象的方式,动态匹配的源动力是virtual,而C# new和override都会阻止这种向下寻求匹配的行为,所以要使虚函数的性质得已保持下去,就要隐藏基类的虚方法,即在派生类中隐藏基类虚方法时,同时加以virtual关键字,使在多层次继承中能够调用到对象自身的版本。

3.在多层次继承中,三个关键字使用次序有限定,new没有使用前提,即不管是普通方法、虚方法还是重写了的方法。virtual的使用,在它的基类不能有函数签名相同的方法,否则系统将提示添加new,即隐藏基类中的方法。virtual一般只出现一次,除非要在子类中隐藏父类的虚方法。

override的使用是为了重写基类虚方法。

上面的描述都很抽象,对于初学者可能不好理解,下面我将用示例来说明这三个用法和区别:此程序在vs2005下调试通过。其中有三个类,分别

为基类BaseClass,继承类InheritClass和继承类的继承类GrandsonClass代码分别如下:

  1. //BaseClass.cs  
  2. namespace NewVirtualOverride  
  3. {  
  4. class BaseClass  
  5. {  
  6. public BaseClass()  
  7. {  
  8. }  
  9. public void Print()  
  10. {  
  11. Console.WriteLine("BaseClassPrint");  
  12. }  
  13. }  
  14. }  
  15. //InheritClass.cs  
  16. namespace NewVirtualOverride  
  17. {  
  18. class InheritClass : BaseClass  
  19. {  
  20. public InheritClass():base()  
  21. {  
  22. }  
  23. public void Print()  
  24. {  
  25. Console.WriteLine("InheritClassPrint");  
  26. }  
  27. }  
  28. }  
  29. //GrandsonClass.cs  
  30. namespace NewVirtualOverride  
  31. {  
  32. class GrandsonClass : InheritClass  
  33. {  
  34. public GrandsonClass():base()  
  35. {  
  36. }  
  37. public void Print()  
  38. {  
  39. Console.WriteLine("GrandsonClassPrint");  
  40. }  
  41. }  
  42. }  
  43. //最后是主程序Program:  
  44. namespace NewVirtualOverride  
  45. {  
  46. class Program  
  47. {  
  48. static void Main(string[] args)  
  49. {  
  50. BaseClass baseclass = new BaseClass();  
  51. baseclass.Print();  
  52. InheritClass inheritClass = new InheritClass();  
  53. inheritClass.Print();  
  54. Console.ReadLine();  
  55. }  
  56. }  

【编辑推荐】

  1. C# GreetPeople方法
  2. C# Hashtable对象分析
  3. 常用C# Arraylist的介绍
  4. C# Observer设计模式
  5. C#交错数组浅析
责任编辑:佚名 来源: 博客园
相关推荐

2009-08-21 14:22:22

C# new和over

2009-08-19 10:09:21

C#和C++

2009-08-28 15:28:22

C# overridenew隐藏

2009-08-31 18:32:01

C# ListBoxE

2009-08-28 11:22:11

C#装箱和拆箱

2009-09-01 16:19:57

C# new()约束

2009-09-03 16:55:58

C#引用类型

2009-09-07 15:31:49

C#支持事件

2009-08-27 10:01:52

C#自动属性

2009-08-20 16:45:03

C#哈希值

2009-09-01 17:08:35

C# Color枚举

2009-09-16 09:01:40

C#多维数组

2009-08-13 17:58:34

C#存储过程

2009-09-07 14:33:02

C# switch语句

2009-09-01 18:25:32

C#结构实例

2009-08-21 17:31:58

C#垃圾回收

2009-08-28 09:30:48

C#命名属性

2009-09-02 13:01:11

C#多路广播

2009-08-13 17:04:09

C#语言C#程序

2009-09-02 17:38:16

C#泛型支持
点赞
收藏

51CTO技术栈公众号