问题描述
- C#中override和new有什么区别?什么时候用new?
-
C#中override和new有什么区别?什么时候用new?
解决方案
override允许我们通过派生一个类自定义基类代码中的一些行为。换言之,基类写好了,调用基类的代码也写好了,我们还希望定制一些代码,但是又不许其他程序员直接修改这些代码,那么可以用重写。
new是为了避免冲突而设计的,这种场合很罕见,但是存在。比如说派生类需要实现一个接口,不得不定义一个和基类重名的方法。
解决方案二:
举例:
class A
{
public virtual void o()
{
Console.WriteLine("ao");
}
public void n()
{
Console.WriteLine("an");
}
}
class B : A
{
public override void o()
{
Console.WriteLine("bo");
}
public new void n()
{
Console.WriteLine("bn");
}
}
A a = new B();
a.o(); // bo
a.n(); // an
(a as B).n(); // bn
解决方案三:
override:派生类覆盖基类的方法,通过基类调用这个方法,调用的是派生类覆盖的。
new:派生类定义一个新的方法,通过基类调用这个方法,调用的是基类的。
解决方案四:
最好不要用new,除非你必须定义一个重名的方法,但是最好另外换个名字。
解决方案五:
?在C#中实现重写方法,可以用new和override两个关键字来实现,究竟他们之间有什么区别呢?下面,我以例子来说明他们之间的微妙区别:
public?class?GrandClass//基类
{
??????? public?GrandClass()
??????? {
??????????????? Console.WriteLine("In?GrandClass.Constructor");
??????? }
??????? public?virtual?void?Method()//用virtual才可以在子类中用override,而new不需要这样
??????? {
??????????????? Console.WriteLine("In?GrandClass.Method()");
??????? }
}
public?class?ParentClass:GrandClass//继承基类,看看override状态
{
????????public?ParentClass()
????????{
????????????????Console.WriteLine("In?ParentClass.Constructor");
????????}
????????public?override?void?Method()//使用override,是说把基类的方法重新定义
????????{
????????????????Console.WriteLine("In?ParentClass.Method()?use?override");
????????}
}
public?class?NewParentClass:GrandClass//继承基类,看看new状态
{
????????public?NewParentClass()
????????{
????????????????Console.WriteLine("In?NewParentClass.Constructor");
????????}
????????new?public?void?Method()//使用new,不是说用到基类的方法,而是重新定义一个子类方法,只不过,方法名称与基类相同
????????{
????????????????Console.WriteLine("In?NewParentClass.Method()");
????????}
}
下面的调用代码:
static?void?Main()?
{
????????GrandClass?Parent=(GrandClass)new?ParentClass();//用override子类加框一个基类对象句柄
????????Parent.Method();
????????GrandClass?NewParent=(GrandClass)new?NewParentClass();//用new子类加框一个基类对象句柄
????????NewParent.Method();
????????NewParentClass?NewParent1=new?NewParentClass();//一个子类句柄
????????NewParent1.Method();
}
结果是这样的:
[1]In?GrandClass.Constructor
[2]In?ParentClass.Constructor
[3]In?ParentClass.Method()?use?override
[4]In?GrandClass.Constructor
[5]In?NewParentClass.Constructor
[6]In?GrandClass.Method()
[7]In?GrandClass.Constructor
[8]In?NewParentClass.Constructor
[9]In?NewParentClass.Method()
结果前的序号是我自己加的.为了以下的分析:
[1],[2]两句是GrandClass?Parent=(GrandClass)new?ParentClass();的结果.(注意一下子类构建器与基类构建器的初始化顺序)
[3]是Parent.Method();结果.
[4],[5]两句是GrandClass?NewParent=(GrandClass)new?NewParentClass();的结果.
[6]是NewParent.Method();的结果.
[7],[8]两句是GrandClass?NewParent1=(GrandClass)new?NewParentClass();的结果.
[9]是NewParent1.Method();的结果.
这里我们可以看到,同样是用子类的对象构造一个基类句柄.结果却很明显,可以看到[3]和[6]的区别.[3]调用了子类的Method(),而[6]调用了基类的Method().
这说明,override可以覆盖基类的方法,让基类的方法以子类的内容实现,而new不用来覆盖基类的方法,而是全新定义一个子类的方法,这个方法只属于子类,与基类的方法无关,只是名字上相同而已.
而这一例子的基础是建立在用子类对象加框成基类对象的,目的是实现用基类句柄调用子类方法,以实现重载的多形性.
如果想调用子类的new方法,用子类的句柄(绝对不能用基类句柄)来调用.结果[9]可以看出来.
用new是在为子类定义方法名时,实在没有办法定义方法名的情况才与基类的方法相同,但这个方法只在子类中起到作用,而不影响基类的方法.也就是说,new方法就是子类新定义的方法.用override是直正意义上的重载.??
解决方案六:
其实这个问题很好解决,你这样理解,override就是覆盖基类的方法,就是派生类根据自己的需要重写她的方法
而new就是把原来的方法隐藏,当我在派生类new了基类的方法后我还可以通过base去调用原来的基类方法