您的位置:知识库 »

谈谈C#中的三个关键词new , virtual , override

作者: Winner.Net  来源: 博客园  发布时间: 2008-09-08 21:41  阅读: 11497 次  推荐: 0   原文链接   [收藏]  
其实细心的朋友在编译这个项目时,会发现出现了如下的警告提示:

 

Code
   
     大致意思是说,基类和继承类中有相同名字的方法,请在继承类中使用new来重新定义方法。这里的微妙之处在于,无论我们是隐式地指定new方法,还是显式的指定,new方法都与基类中的方法无关,在名称、原型、返回类型和访问修饰符方面都无关。
     我们将程序中的Print()方法都变成new public void Print()后,上面的异常就不会发生了。再次运行程序,结果不变。new就是继承类使用与基类方法相同的名字对基类方法的重写。
     下面我们看看virtual 和 override的搭配使用方法。
     把BaseClass.cs改变如下:public virtual void Print();
     把InheritClass.cs改变如下:public override void Print();
     运行程序,结果如下:
     BaseClassPrint
     InheritClassPrint

 

     虽然结果与用new修饰符差不多,,但是其中的含意可不同,new是继承类对基类方法的重写而在继承类中产生新的方法,这时基类方法和继承方法之间没有任何的关系了,可是override就不同了,它也是对基类中方法的重写,但此时只是继承类重写了一次基类的方法。可以参考下面的例子来加深理解。

将Program.cs改变如下:

 


BaseClass baseclass = new BaseClass();
baseclass.Print();
InheritClass inheritClass
= new InheritClass();
inheritClass.Print();
BaseClass bc
= new InheritClass();
bc.Print();
   分别运行用new修饰和用virtual/override修饰的程序,其结果如下:
    用new修饰的结果
   BaseClassPrint
   InheritClassPrint
   BaseClassPrint
    用virtual/override修饰的结果:
   BaseClassPrint
   InheritClassPrint
   InheritClassPrint
   从上面的结果可以看出,在用new修饰的情况下,虽然bc是用InheritClass创建的实例,但是bc.Print()打印的还是BaseClassPrint,因为此时BaseClass和InheritClass中的Print已经是互不相同没有关系的两个方法了,而在virtual/override修饰的情况下,bc调用的Print方法已经被其子类override了,所以就打印了InheritClassPrint。

0
0

热门文章

    最新文章

      最新新闻

        热门新闻