C# override重写与new隐藏的区别

开发 后端
C# override重写,是指对父类中的虚方法(标记virtual)或抽象方法(标记为abstract)进行重写。本文介绍了C# override重写与new隐藏的区别,供大家参考。

C#比java多一个new隐藏的功能。C# override重写相当于java中没有关键字的方法重写。所以java中方法是没有隐藏功能的。

C# override重写,是指对父类中的虚方法(标记virtual)或抽象方法(标记为abstract)进行重写,实现新的功能,它必须与父类方法的签名完全一致,而且与父类方法的可访问性也必须一致 new隐藏,是指在子类中重新定义一个签名与父类的方法相同的方法,这个方法可以不用new修饰,只是编译时会弹出一个警告信息:如果是有意隐藏,请使用关键字new。

  1. using System;     
  2. public class Test      
  3. {     
  4.     public static void Main(String[] args){     
  5.         A a=new B();      
  6.         Console.Write(a.getVal()); // 输出:A 虽然实例是B,但是执行的却是A的方法     
  7.     
  8.         a=new C();      
  9.         Console.Write(a.getVal()); // 输出:C 实例是C,而且C重写的A的方法,所以执行C的方法     
  10.     
  11.         B b=new B();      
  12.         Console.Write(b.getVal()); // 输出:B 只有定义和实例都是B,才执行B的方法     
  13.     }      
  14. }     
  15. class A     
  16. {     
  17.     // 要允许子类重写,方法必须标识为virtual 或 abstract     
  18.     public virtual String getVal(){      
  19.         return "A";      
  20.     }      
  21. }      
  22. class B : A     
  23. {     
  24.     // 隐藏父类方法 用new标识,不标识时会出现编译警告,不影响使用     
  25.     public new String getVal(){      
  26.         return "B";      
  27.     }      
  28. }      
  29. class C : A     
  30. {     
  31.     // 重写方法 必须用override标识     
  32.     public override String getVal(){      
  33.         return "C";      
  34.     }      
  35. }    

而在Java中,不存在隐藏父类方法这一概念,Java只有重写方法这一概念,同样的代码,在Java中执行和C#中执行截然不同:

  1. class test     
  2. {     
  3.     public static void main(String[] args)     
  4.     {     
  5.         A a=new B();      
  6. // 输出:B  实例是B,执行的也是B的方法(在C#中,此时应该输出A)     
  7.         System.out.println(a.getVal());      
  8.          a=new A();      
  9. // 输出:A 只有定义和实例都是A,才执行A的方法     
  10.         System.out.println(a.getVal());      
  11.     }     
  12. }     
  13. class A     
  14. {     
  15.     public String getVal(){      
  16.         return "A";      
  17.     }      
  18. }      
  19. class B extends A     
  20. {     
  21.     public String getVal(){      
  22.         return "B";      
  23.     }      
  24. }    

好了,C# override重写与new隐藏的区别就介绍到这里。

【编辑推荐】

  1. 学习C#消息:循序渐进
  2. 解惑答疑:C#委托和事件
  3. 学习C#实现HTTP协议:多线程文件传输
  4. 进一步接触C#委托与事件
  5. 浅析四种C#转换的区别
责任编辑:book05 来源: cnblogs
相关推荐

2009-08-25 17:15:50

C#隐藏C#重写C#重载

2009-08-21 14:22:22

C# new和over

2009-08-26 14:54:23

C# new和over

2009-08-24 17:45:39

Java与C#的区别

2009-08-18 12:23:38

2009-08-27 11:21:36

C# override

2009-08-13 17:30:30

C#构造函数

2017-09-30 09:10:21

Java重写变量

2009-09-01 16:19:57

C# new()约束

2011-05-24 16:46:48

mallocfreenew

2009-08-31 09:19:31

c#隐藏窗口

2009-09-04 11:35:05

C#方法重写

2011-06-02 13:28:17

OverloadOverride

2020-02-28 09:00:00

ObjectC#编程语言

2009-08-27 13:06:13

C# new修饰符

2009-08-11 14:16:38

C# New运算符

2013-07-25 13:15:55

iOS开发学习new与allocinit区别

2011-06-14 12:27:38

C#C++

2013-05-23 17:21:16

C#

2010-07-12 09:07:30

C#
点赞
收藏

51CTO技术栈公众号