class A 

public virtual void F() 

Console.WriteLine("A"); 

}  class B : A 

public override void F() 

Console.WriteLine("B"); 


class C : B 

(1) public override void F() { Console.WriteLine("C"); }
(2) public new void F() { Console.WriteLine("C"); }
}  class Tester
{
static void Main()
{
A a = new C(); 
a.F(); 
}
}
    在class C中,如果用(1),结果就是“C”;如果用(2),结果就是“B”,为什么啊?
请问new和override到底什么区别啊,没搞定,请赐教,谢谢!

解决方案 »

  1.   

    这么说吧,virtual/override还是在同一个上下结构的,系统会根据当前的类型找到对应的方法,正宗的多态形式,而new则就是另开山头,独立门户了,重新开始一个上下结构class C : B 

    (1) public override void F() { Console.WriteLine("C"); }
    (2) public new void F() { Console.WriteLine("C"); }
    } class C : B 

     public override void F() { Console.WriteLine("C"); }
    } A a = new C(); 
    a.F(); 还是原来的上下结构,因为a的类型是C,最终调用的是C的方法class C : B 

       public new void F() { Console.WriteLine("C"); }
    } A a = new C(); 
    a.F(); C说我要独立门户,这个新的F跟基类的F无关,因为变量类型是基类A,你调用F(),它在自己的继承类找同一上下结构的方法F,最终找到B的
      

  2.   

    老大,每天这个时候你都在,真是太好了:)那按你的说法,我如何调用class C中new出来的这个F()呢?还有,想请教的是,那你的说法,这样设计出new和ovwerride,有什么优越性吗?
    能否再拓开谈谈它们之间的关系?谢谢!
      

  3.   

    >>>那按你的说法,我如何调用class C中new出来的这个F()呢?you cannot call it from a variable of type A, you need to call it from a variable of type C>>>这样设计出new和ovwerride,有什么优越性吗?能否再拓开谈谈它们之间的关系?it depends on how you design your class hierarchy, C# just provides the flexibility