1.在类继承中,new是隐藏父类的方法,override是重写父类的方法。下面举例说明:
using System;
namespace Ch10Ex02
{
/// <summary>
/// 虚函数隐藏和重写的例子1
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
MyDerivedClass myDerivedObj=new MyDerivedClass();
MyBaseClass myBaseObjalone=new MyBaseClass();
MyBaseClass myBaseObj;
myBaseObj=myDerivedObj; //将子类对象赋给父类引用,有类型转换
myBaseObj.DoSomething();
myDerivedObj.DoSomething();
myBaseObjalone.DoSomething();
}
}
public class MyBaseClass //父类
{
public virtual void DoSomething()
{
Console.WriteLine("this is Baseimp");
}
}
public class MyDerivedClass:MyBaseClass //子类,继承了父类MyBaseClass
{
public new void DoSomething()
{
Console.WriteLine("this is Deriveimp");
}
}
}
本程序运行结果是:
this is Baseimp;
this is Derivedimp;
this is Baseimp;
如果修改加了颜色的代码段为:
public override void DoSomething()
{
Console.WriteLine("this is Deriveimp");
}
结果是:
this is Derivedimp;
this is Derivedimp;
this is Baseimp;
从这个例子中可以看出:new只是隐藏基类中的虚方法,相当于全新定义了一个子类的新方法,他属于子类;如果在多态的情况下,使用基类的引用,会调用基类的虚拟成员,即实现了多态。如果用ovrride重写,就算用基类的引用,使用的也是重写后的成员,让基类的方法以子类的内容实现,即基类的虚拟成员“好象”被改写。
另外,用override重写父类方法的时候,只有方法内容可以不同,其他(方法名,参数列表,返回值)一定要相同;而new就不一定了,可以相同,也可以不同。