C#之——virtual override new关键字
自从工作后,就再没有动手更新自己的博客了,因为自己实在是没什么可写。最近在重新看<C#高级编程>,下面的正文是从自己的学习笔记整理的关于继承中virtual,override,new三个关键字的,希望不正确的地方有人可以给我指出来。
一、关键字的辨析
1、 virtual
用于将一个基类函数声明为虚拟方法,这样在派生类中可以对虚方法进行重写。该关键字不能用在成员字段和静态函数上,因为这个概念只对类中的实例函数成员才有意义。可以和new关键字一起使用。
2、 override
当派生类需要对基类的虚方法进行重写时,必须使用override,否则如果使用了与父类相同的函数声明,那么派生类方法就会隐藏基类方法。重写方法和隐藏方法在调用结果上有很大的不同。
3、 new
在第2点中已经说了,如果是在派生类中使用了与基类相同的函数声明,但又没有使用virtual和override关键字,那么派生类方法就会隐藏基类方法。此时VS会提示使用new关键字。也就是说,new关键字在派生类中用于显示的声明一个隐藏方法,此时派生类的方法和基类中的方法完全无关。调用时,将不能使用基类的引用访问派生类的隐藏方法。可和virtual关键字一起使用。
二、代码示例
1、基类
BaseClass
BaseClass
2、派生类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class BaseClass
{
public virtual void VirtualMethod()
{
Console.WriteLine("This method is virtual and defined in BaseClass...");
}
public void HideMethod()
{
Console.WriteLine("This method is hide and defined in BaseClass...");
}
}
2、派生类
DeriveClass
DeriveClass
3、
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class DeriveClass : BaseClass
{
public override void VirtualMethod()
{
Console.WriteLine("This method is override and defined in DeriveClass...");
}
public new void HideMethod()
{
Console.WriteLine("This method is hide and defined in DeriveClass...");
}
}
3、
方法调用
Main
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
static void Main(string[] args)
{
BaseClass bc = new BaseClass();
bc.VirtualMethod();
bc.HideMethod();
DeriveClass dc = new DeriveClass();
dc.VirtualMethod();
dc.HideMethod();
BaseClass bc1 = new DeriveClass();
bc1.VirtualMethod();
bc1.HideMethod();
Console.ReadKey();
}
4、以上程序输出结果为:
This method is virtual and defined in BaseClass...
This method is hide and defined in BaseClass...
This method is override and defined in DeriveClass...
This method is hide and defined in DeriveClass...
This method is override and defined in DeriveClass...
This method is hide and defined in BaseClass...
三、总结
在C#中,函数在默认情况下不是虚拟的,但可以使用virtual关键字来进行声明(构造函数除外),在派生类中使用override关键字来显示声明进行重写。一般情况下,尽可能的不要使用隐藏方法,因为这样有可能出现调用冲突,这时最好是对函数进行重命名,如果重命名是不可能的(比如说函数是在已经发布的库文件中),那么使用隐藏方法将不会影响已有的代码,而现有代码如果需要调用派生类的方法,将不能通过基类实例绕过派生类类型进行调用,此时必须使用派生类实例调用自身的隐藏方法。
作者:Libo@Deng
出处:http://www.cnblogs.com/cxcco/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
我的微博:
新浪微博