最近在 《你必须知道的.NET》中看到了 关键字 new、Override 的用法,有一点疑问,请大家指教……代码如下: using System;namespace InsideDotNet.Keywords.New
{    class MyC
    {
    }    class Number
    {
        public static int i = 123;        public virtual void ShowInfo()
        {
            Console.WriteLine("base class---");
        }        public virtual void ShowNumber()
        {
            Console.WriteLine(i.ToString());
        }
    }    class IntNumber : Number
    {
        new public static int i = 456;        public new virtual void ShowInfo()
        {
            Console.WriteLine("Derived class---");
        }        public override void ShowNumber()
        {
            Console.WriteLine("Base number is {0}", Number.i.ToString());
            Console.WriteLine("New number is {0}", i.ToString());
        }
    }    class Test_Number
    {
        public static void Main()//Main_6_1_1
        {
            Number num = new Number();
            num.ShowNumber();
            IntNumber intNum = new IntNumber();
            intNum.ShowNumber();
            intNum.ShowInfo();            Number number = new IntNumber();
            //究竟调用了谁?
            number.ShowInfo();
            //究竟调用了谁?
            number.ShowNumber();

        }
    }
}问题如,代码中 红色显示。还有个问题就是  关键字 new 和override 的本质上用法上有撒区别呢,请高手们给俺解释解释,谢谢。

解决方案 »

  1.   

    唉,代码里不能标注颜色呀。呜呜 。问题是 在Main 函数 调用时候 “究竟调用了谁?”
      

  2.   

    new 就是他爹的东西都拿过来
    override就是他爹的东西他都不要,就要自己的。
      

  3.   

    还有个问题就是  关键字 new 和override 的本质上用法上有撒区别呢,请高手们给俺解释解释,谢谢。 
      

  4.   

    见到virtual的时候这个就是根,可以不管上边是否有继承了~
      

  5.   

    Number num = new Number();
    先调Number,
    IntNumber intNum = new IntNumber();
    先调Number,
    再调IntNumber
    Number number = new IntNumber();
               [color=#FF0000] //究竟调用了谁?
                number.ShowInfo();
                //究竟调用了谁?调用了IntNumber
      

  6.   

                Number number = new IntNumber();
               //究竟调用了谁?
                number.ShowInfo();------------这个先调用父类的ShowInfo方法Console.WriteLine("base class---"),在调用自己的ShowInfo方法里面的内容Console.WriteLine("Derived class---");
                //究竟调用了谁?
                number.ShowNumber();------------这个因为子类里面用了override,所以直接调用子类中的内容
                Console.WriteLine("Base number is {0}", Number.i.ToString());
                Console.WriteLine("New number is {0}", i.ToString());

      

  7.   

    override重写虚方法,那么就只剩下重写以后的方法;
    new隐藏基类的方法,那么基类的方法和当前类的方法同时存在只是被隐藏了;
      

  8.   

    你问的这个问题就是关于隐藏基类方法问题~!
    一旦类A的CHS方法被类B重新NEW了(即重写了基类A的CHS方法)~!那么
    A KK=NEW A();
    KK.CHS;//此时就还是调用A的CHS方法;
    B JJ=NEW B();
    KK=JJ;
    JJ.CHS;//此时调用的是被B重写的CHS方法;
    KK.CHS;//此时调用的是被B重写的CHS方法;(记得给分)
      

  9.   

    new 就是他爹的东西都拿过来 
    override就是他爹的东西他都不要,就要自己的。
    --经典
      

  10.   

    关键字 new 和override 的本质上用法上有撒区别呢-->
    new关键字只会影响到当前类对象实例。对基类对象不产生影响
    在楼主的实例中他就只是会对IntNumber intNum 这个实例产品影响,然而对(基类)Number num 不会有影响override也叫重写,他是派生类对基类方法的一个重写,但他是想象中那样直接影响到基类方法
    只有当使用派生类去实例化基类的时候才会影响
    即Number num =new Number()这样是不会受override方法影响的
    只有Number num =new intNumber()时。基类对象就会去调用基类override以后的方法
      

  11.   

    在子类中new的方法,调用时执行声明的类型的方法。
    在子类中override的方法,调用时执行实例化的类型的方法。
    在楼主的例子中ShowInfo是new,ShowNumber是override。看代码:
    Number num = new Number();
    num.ShowNumber();
    IntNumber intNum = new IntNumber();
    intNum.ShowNumber();Number number = new IntNumber();
    number.ShowNumber();上面3种调用ShowNumber,看等号右边,实例化的是什么类型。同样的:
    Number num = new Number();
    num.ShowInfo();
    IntNumber intNum = new IntNumber();
    intNum.ShowInfo();Number number = new IntNumber();
    number.ShowInfo();上面3种调用ShowInfo,看等号左边,声明的是什么类型。
      

  12.   

    我发现我说错了,new那个应该是执行Console.WriteLine("base class---"),其他的都隐藏,唉,基础知识啊这样子的Number number = new IntNumber();
    number.ShowInfo();
    因为numberShowInfo()调用的是Number类里面的ShowInfo方法,其他的都隐藏掉了
      

  13.   

    new 就是指鹿为马 ,实际鹿还是鹿,马还是马,只是你非要把鹿叫做马而已
    override 是偷梁换柱,“梁”已经不在了,现在只有“柱”
      

  14.   

    new关键字跟继承没有关系,可以用在一个类的子类。当子类的一个方法用到new(这个方法可以和基类的一个方法同名,也可以不同),调用的时候会运行基类的同名方法,而不会调用子类有new关键字的方法;override只是在继承的时候才会用到,用在子类要覆盖基类方法的方法。当一个子类的方法用到override 关键字,在调用的时候会运行子类中相应的方法
    。class A 
      { 
        public virtual void Test() 
        { 
          Console.WriteLine("A"); 
        } 
      } 
     
      class A1 : A 
      { 
        public override void Test() 
        { 
          Console.WriteLine("A1"); 
        } 
      } 
     
      class A2 : A 
      { 
        public new void Test() 
        { 
          Console.WriteLine("A2"); 
        } 
      } 
     
      class Test 
      { 
        static void Main(string[] args) 
        { 
          A a1 = new A1(); 
          A a2 = new A2(); 
     
          a1.Test(); 
          a2.Test(); 
          (a2 as A2).Test(); 
     
          Console.Read(); 
        } 
      } 输出结果是: A1

    A2
      

  15.   

    new 声明一个类的实例,即,把一个抽象的类具体化
    override 重写同名函数(可理解为覆盖原有函数)
      

  16.   

    这个根据CLR对虚方法和实例方法的调度机制上比较好理解。首先要说明的是CLR已经在托管堆中初始化了两块内存,用于存储Number类型对象和IntNumber类型对象,其中存放的是方法和静态字段的代码。
    Number number = new IntNumber();//这计划构造了一个number实例对象,CLR在内存中分配一块内存用于存放number,number的类型对象指针却是指向IntNumber类型对象的。
    //如果调用number的实例方法的话,number实例对象不会管类型对象指针,直接调用Number类型对象中的方法。
    //如果是调用virtual方法并且子类中重载了(override)的话,number实例对象会取得类型对象指针,调用它的实际类型中的方法。这就解释了number.ShowNumber()是调用的IntNumber中的方法。
    //如果使用了New关键字,就表示子类中的ShowInfo方法和基类中的showInfo方法没有关系,因此它不会查找类型对象指针,直接调用Number中的方法
      

  17.   

    正解
    override是覆盖基类方法,基类的方法就不能访问了(也就是说被子类改了),就只能实现子类的方法。
    new 其实基类、子类的方法都存在,通过子类的实例可以访问子类方法,通过基类实例可访问基类方法
      

  18.   

    先说override,他的意思是说子类把父类的方法重写了,也就是覆盖了,子类的模板里已经没有父类的那个方法了。所以你用子类去实例化父类的时候,如果父类的实例调用了该方法名,那么调用的将是子类重写过的方法。
    你的代码(用子类实例化父类)就是 
    Number number = new IntNumber();
    number.ShowNumber();
    至于输出是相应的
     Console.WriteLine("Base number is {0}", Number.i.ToString());
     Console.WriteLine("New number is {0}", i.ToString());
    这段代码打印的内容。
    用子类实例化子类的话
    IntNumber intNum = new IntNumber();
     intNum.ShowNumber();
    输出的也会是
     Console.WriteLine("Base number is {0}", Number.i.ToString());
     Console.WriteLine("New number is {0}", i.ToString());
    这段代码打印的内容。
    而new,他的意思是说,父类的方法,我不动它,我会重新建立一个方法,和父类的方法的签名是一样的,而对于外界来说子类把父类的同名方法给隐藏了,也就是说父类的那个方法还是在类模板里存在的,子类有重新写了一个新的方法,并把父类的那个1方法隐藏了。
    你的代码(子类实例化父类)就是
    Number number = new IntNumber();
    number.ShowInfo();
    输入结果应该是
     Console.WriteLine("base class---");
    这段代码打印的内容
    而如果用子类实例化子类的话
    IntNumber intNum = new IntNumber();
    intNum.ShowInfo();
    输入的将是
     Console.WriteLine("Derived class---");
    这段代码输出的内容。
      

  19.   

    Number number = new IntNumber();
    number.ShowInfo();调用父类的ShowInfo(),因为子类的ShowInfo()是子类独有的,不是继承下来的,只是函数名称和父类那个函数一样
    new 的作用就是子类新定义的方法,只是名称和父类相同。用override是直正意义上的重载
    number.ShowNumber();调用子类方法,
      

  20.   

    new 声明一个类的实例,也就是创建对象,然后通过对象来使用类内的成员和方法
    override 重写同名函数 
      

  21.   

    new 和override 根本就不是一回事,怎么说区别?