c#中virtual,new和override的区别
作者&投稿:狐洁 (若有异议请与网页底部的电邮联系)
如果你用override,则无论调用的是A类还是B类中的TEST(),系统都会找到它实质类的TEST();
如果是用的New,则可以通过类型转换调用到基类的TEST();
下面是override的情况:
A a = new A();
B b = new B();
A a1=new B();
a.Test();//调用A中Test();
b.Test();//调用B中Test();
a1.Test();//调用B中Test();系统会自动识别a1是B的实例
((A)b).Test();//与上面相同
下面是new的情况:
A a = new A();
B b = new B();
A a1=new B();
a.Test();//调用A中Test();
b.Test();//调用B中Test();
a1.Test();//调用A中Test();
((A)b).Test();//与上面相同
overrride表示重写 这个类是继承于Shape类
public override double Area 这个属性再shape中肯定存在 但是这里我们不想用shape中的 所以要重写
virtual是告诉其它想继承于他的类 你可以重写我的这个方法或属性,否则不允许。
给你一个生动的例子 老爸表示基类(被继承的类) 儿子表示子类(继承的类)
老爸用virtual告诉儿子:"孩子,你要继承我的事业,在这块上面可以自己继续发展你自己的"
儿子用override告诉全世界:"这个我可不是直接拿我爸的,他只是指个路给我,是我自己奋斗出来的"
a) 作为运算符用来创建一个对象和调用构造函数。
b) 作为修饰符。
c) 用于在泛型声明中约束可能用作类型参数的参数的类型。
在本文中,只具体介绍new作为修饰符的作用,在用作修饰符时,new关键字可以在派生类中隐藏基类的方法,也就说在使用派生类的方法是调用的方法是New关键字新定义出来的方法,而不是基类的方法。在不使用New关键字来隐藏基类方法也是可以的,编译器会出现一个警告,提示如果有意去隐藏基类的方法,请使用New关键字修饰。
这里有个注意事项就是New和Override这两个关键字是互斥的。不可以同时使用。
二、 Override关键字主要是提供派生类对基类方法的新实现,重写的基类方法必须和Override的方法具有相同的签名, 此关键字不可以用于重写非虚方法和静态方法,与其配套使用的关键字是Virtual、abstract、Override。与此同时,Override方 法还不可以修改Virtual方法的可访问性,Override方法和Virtual方法必须具有相同的访问修饰符,不能使用修饰符 new、static、virtual 或 abstract 来修改 override 方法。
以下是一个小demo,展示了new和override的本质区别:
class Program
{
static void Main(string[] args)
{
contact ct1 = new class1();
contact ct2 = new class2();
ct1.prinf();
ct2.prinf();
}
}
abstract public class contact
{
public virtual void prinf()
{
Console.WriteLine ("这是虚方法");
}
}
public class class1 : contact
{
public override void prinf()
{
Console.WriteLine ("这是新的方法");
}
}
public class class2 : contact
{
public new void prinf()
{
Console.WriteLine ("这是另一个新的方法");
}
}
此demo运行结果为:
这是新的方法
这是虚方法
三、 Virtual 关 键字允许在派生类中重写这些对象,默认情况下,方法是非虚拟的,不可以重写非虚方法,virtual关键字不可以与static、abstract、 private、override一起使用。Virtual关键字又是和override紧密不可分的,如果要实现Virtual方法就必须要使用 override或new关键字(new和override产生的机理不同)。
总结:New关键字主要用来区别派生类和基类同名方法的选择问题,通过隐藏基类方法,达到使编译器调用正确的方法的目的。Override主要用来对基类的方
法和虚方法进行重写。
直怖丽科: new关键字 1、用于创建对象.如:Class1 o = new Class1(); 2、用于向基类成员隐藏继承成员.如: public class BaseC { public int x; public void Invoke() {} } public class DerivedC : BaseC { new public void Invoke() {} } virtual 关键字 用于修饰方法...
青冈县13589654228: C#是方法的重写关键字override,virtual,new 有什么区别? - ?
直怖丽科: virtual是虚方法,就是等着被重写的,override就是重写后的virtual方法.至于new方法,是父类有这个一样的方法了(同名同参同返回值),但是子类用自己的方法,不用父类的那一套,就new一个,意思是我用我自己的
青冈县13589654228: c#中virtual,new和override的区别 - ?
直怖丽科: 一、在C#中,new这个关键字使用频率非常高,主要有3个功能:a) 作为运算符用来创建一个对象和调用构造函数.b) 作为修饰符.c) 用于在泛型声明中约束可能用作类型参数的参数的类型.在本文中,只具体介绍new作为修饰符的作...
青冈县13589654228: c#里面virtual 有什么用...不是很了解 - ?
直怖丽科: 首先你如果不用virtual重写的话,系统默认会为你加new关键字,他的作用是覆盖,而virtual的关键作用在于实现多态,理解一下多态你就会明白为什么这么用了,对于日后软件版本的升级,实现版本兼容性,甚至于扩展都非常重要
青冈县13589654228: c#中void与override区别是什么 - ?
直怖丽科: void 指方法没有返回值.override是重写,这是对父类的一个定义好的方法的重写. 例如: class NewBase//定义一个类 { public new virtual void Show()//定义一个虚方法 { Console.WriteLine("我来自子类"); } } class ANewBase : NewBase { public override void Show() //这就是对类方法的重写 { Console.WriteLine("我来自子类的子类"); } }
青冈县13589654228: c#不是虚方法的方法能用ovreride重写吗 - ?
直怖丽科: 显然不是嘛,虚拟或抽象方法才能重写 仔细看看:------------------------------------- virtual 用在基类中,指定一个虚方法(属性),表示这个方法(属性)可以重写. override 用在派生类中,表示对基类虚方法(属性)的重写.以上的基类和派生类都...
青冈县13589654228: 关于C# virtual关键字重写还是覆盖 - ?
直怖丽科: public virtual new int Insert() 已在类(父类)中有一个Insert方法,使用New可以覆盖掉那个方法而生成一个新的Insert虚方法,与原来的方法只是名称上一样,但是成了另一个函数 public virtual int insert() 声明了一个虚的方法,此方法可以在继承的子类中进行重写.public override int insert() 此处是重写基类的虚方法insert.函数的签名必需与父类一致.
青冈县13589654228: c#中new和override的区别 - ?
直怖丽科: 如果你用override,则无论调用的是A类还是B类中的TEST(),系统都会找到它实质类的TEST(); 如果是用的New,则可以通过类型转换调用到基类的TEST();下面是override的情况: A a = new A(); B b = new B(); A a1=new B(); a.Test...
青冈县13589654228: C# 中virtual 函数怎么用的 - ?
直怖丽科: virtual其实在程序的版本升级中都要用到,因为一个程序不是做的非常完美之后才把它投放到市场去让客户使用的,这样也不会发现程序的漏洞,另外也挣不到利润啦,所以每个程序都有一个升级的过程 visual由于可以使用new关键字来隐藏基类中的同名成员和方法外,还可以使用override来重写.使用它既可以保持与以前的版本实现兼容,又可以向后扩展.就拿.NET来说吧:vs2005 到 vs2008这就是一个升级的过程 在Object类中有一个ToString的虚方法,它在以后得继承Ojbect类的子类中就可以重写ToString了.其实这就是一个多态的问题了.是.NET的一个亮点哦!当然招聘的同志会问你这个啦!
青冈县13589654228: C#中重写和覆盖的区别 - ?
直怖丽科: #中重写(override)和覆盖(new)的区别 重写 用关键字 virtual 修饰的方法,叫虚方法.可以在子类中用override 声明同名的方法,这叫“重写”.相应的没有用virtual修饰的方法,我们叫它实方法. 重写会改变父类方法的功能. 覆盖 在子类...