C# 基础知识:virtual,new和override的区别

A类 有方法 public virtual void test() 
B类继承自A类,有方法 public new void test()

或者B类继承自A类,有方法 public override说void test()

如果你用override,则无论调用的是A类还是B类中的test(),系统都会找到它实质类的test(); 
如果是用的New,则可以通过类型转换调用到基类的test();
 

下面是override的情况: 
A a1=new B(); 
a1.test();//调用B中test();系统会自动识别a1是B的实例 
((A)b).test();//与上面相同 

下面是new的情况: 
A a1=new B(); 
a1.test();//调用A中test(); 
((A)b).test();//与上面相同

另外:virtual是虚方法,就是等着被重写的,override就是重写后的virtual方法。至于new方法,是父类有这个一样的方法了(同名同参同返回值),但是子类用自己的方法,不用父类的那一套,就new一个,意思是我用我自己的

如果没有理解,不要紧,下在是在网上看到另一个例子:

在C#中,如果你在声明一个方法的时候用了virtual这个关键字,那么,在派生类中,你就可以使用override或者new关键字来弃用它或是忽略它.如果你在父类中用了virtual这个关键字,而在其派生类中又没有用override或 new关键字,而直接引用一个同名方法的话,编译器将会报错,并将以new方式,即忽略派生类中的方法的方式来运行 .下面的例子可以帮助你来理解:

输出:

MyDerived-Meth1
MyBase-Meth2
MyBase-Meth3
可以很明显地看出来,后两个new关键字的输出是父类中的方法的输出,所以可以看出,new这个关键字的作用是如果在以前的版本中有这个方法,就沿用以前的方法,而不用我现在方法内容.而virtual的方法的作用正好相反,它的作用是如果在父类中有这样一个方法,则用我现在写的方法内容,让以前的滚蛋!不过,这里用new好象不太好,让人误解.

如果你把第037行去掉,把039-041中的mB全部改为mD,输出又变为:

MyDerived-Meth1
MyDerived-Meth2
MyDerived-Meth3

这又说明了什么呢,说明了派生类的对象只有在被父类重塑的时候,override和new关键字才会生效.这样说的确有点难以理解,大家只有自己动手,才能搞清楚这其中的机关!

// Versioning/versioning.cs
 public class MyBase 
 {
     public virtual string Meth() 
     {
         return "MyBase-Meth";
     }
     public virtual string Meth() 
     {
         return "MyBase-Meth";
     }
     public virtual string Meth() 
     {
         return "MyBase-Meth";
     }
 }
 
 class MyDerived : MyBase 
 {
     public override string Meth() 
     {
         return "MyDerived-Meth";
     }
     public new string Meth() 
     {
         return "MyDerived-Meth";
     }
     public string Meth() // 系统在这里将会有一个警告,并且将会隐藏方法Meth() 
 
 
     {
     return "MyDerived-Meth";
     }
 
     public static void Main() 
     {
         MyDerived mD = new MyDerived();
         MyBase mB = (MyBase) mD;
 
         System.Console.WriteLine(mB.Meth());
         System.Console.WriteLine(mB.Meth());
         System.Console.WriteLine(mB.Meth());
     }
 }

备注:其实就是virtual-new 和 virtual-override的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值