代码:
public abstract class A  

        public A()  
       { 
            Console.WriteLine('A'); 
        } 
        public virtual void Fun()  
       { 
            Console.WriteLine("A.Fun()"); 
        } 
} public class B: A  

        public B() 
       { 
            Console.WriteLine('B'); 
        }         public new void Fun()  
       { 
            Console.WriteLine("B.Fun()"); 
        }         public static void Main()  
       { 
           A a = new B(); 
           a.Fun(); 
        } 

public class C: A  

        public C() 
       { 
            Console.WriteLine('C'); 
        }         public override void Fun()  
       { 
            Console.WriteLine("C.Fun()"); 
        }         public static void Main()  
       { 
           A a = new B(); 
           a.Fun(); 
           a=new C();
           a.Fun();
        } 
} 执行结果:
A
B
A.Fun()
A
C
C.Fun()
从结果可以看到new关键字修饰的方法没有被执行,而执行了基类的方法。这是为什么啊?不是说new会隐藏基类方法吗
而override却执行了本类的方法

解决方案 »

  1.   

    关键在 A   a   =   new   B(); 你把B赋值给了一个A基类类型的变量,所以体现出来的就是A基类里面的特性。
    举个例子,假设马有个速度属性,速度50-80公里/小时,千里马也有个速度属性,为120公里/小时.
    当你把千里马当做普通马来用的话,那么如果想要知道它的速度属性就应该是50-80而不是120,因为120是千里马的特殊性,而不能代表马的普遍性,
    比如你这么写:马 ma = new 千里马();
    只有当你把千里马当作一个特定的示例来用,才可以说它的速度属性是120,
    比如你这么写: 千里马 QLma = new 千里马();
      

  2.   

    当你把千里马当做普通马来用的话,嘿嘿,因为你不是伯乐嘛,所以你并不知道那是千里马,而把它当普通马,所以别人问你这匹马跑多快啊?那么你就告诉别人是50-80公里/小时
    比如你这么写:马   ma   =   new   千里马(); 
    假如你是伯乐呢,你知道这是一个千里马,而且也把它当千里马来用,别人问你呢,你就会说是120 呵呵 
    比如你这么写:   千里马   QLma   =   new   千里马();这么说可能比较容易理解吧。
      

  3.   

    可能你的疑惑还在于,为什么使用了override  以后 也是赋值给了A基类类型的变量,结果出来反而是重写以后的数据吧!
    其实用override 重写以后呢,是相当于这样的。
    当你把千里马当做普通马来跑,嘿嘿,不管你是不是伯乐,因为它是千里马的特殊性,它跑起来都是可以达到120公里/小时
      

  4.   

    to:楼上我想问的是为什么用关键字new的方法没有被执行而用override却可以执行。new也是隐藏基类的方法啊
    上面代码应这样写标准一些:
    public   abstract   class   A     
    {   
                    public   A()     
                  {   
                            Console.WriteLine( 'A ');   
                    }   
                    public   virtual   void   Fun()     
                  {   
                            Console.WriteLine( "A.Fun() ");   
                    }   
    }   public   class   B:   A     
    {   
                    public   B()   
                  {   
                            Console.WriteLine( 'B ');   
                    }                   public   new   void   Fun()     
                  {   
                            Console.WriteLine( "B.Fun() ");   
                    }   
    }   
    public   class   C:   A     
    {   
                    public   C()   
                  {   
                            Console.WriteLine( 'C ');   
                    }                   public   override   void   Fun()     
                  {   
                            Console.WriteLine( "C.Fun() ");   
                    }     
    }   
    执行:
    private void button8_Click(object sender, System.EventArgs e)
    {
     A   a   =   new   B();   
     a.Fun();   
     a=new   C(); 
     a.Fun(); 
    }执行结果: 


    A.Fun() 


    C.Fun() 
      

  5.   

    用new的话A       a       =       new       B();  B       a       =       new       B(); 
    a.Fun();的结果是不一样的。
    而用override,你用A       a       =       new       B();  B       a       =       new       B(); 
    a.Fun();的结果是一样的。
    那个new是互相隐藏的。
      

  6.   

    new 关键字可以显式隐藏从基类继承的成员,隐藏继承的成员意味着该成员的派生版本将替换基类版本
    但 不是扩展继承成员的实现.
    而override 则扩展继承成员的实现.
    所以new过的方法是不可以通过基类调用的
      

  7.   

    new 是保留基类方法的前提下新的方法
    overwrite 是彻底覆盖基类方法
    B a   =   new   B();   
    a.Fun();就是 "B.Fun()" 了.这是面向对象的基础知识
      

  8.   

    to:楼上
    你是说new 是在本类写一个与基类同名的方法,而override是把基类的同名方法给干掉了后产生自己的新方法。所以new的方法和本类的其它正常的方法(即和基类没有关系的方法)一样用,就象没有基类一样。而基类的virtual方法也正常使用,是这样吗?