new和override的区别

来源:互联网 发布:漏斗分析模型 算法 编辑:程序博客网 时间:2024/05/10 01:20

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就不一定了,可以相同,也可以不同。