using System;
using System.Collections.Generic;
using System.Text;namespace Test1
{
    class A
    {
        public void F()
        {
            Console.WriteLine("A.F");
        }
        public virtual void G()
        {
            Console.WriteLine("A.G");
        }
        
    }
    class B : A
    {
         new public void F() //基类的方法被派生类隐藏(New), 
        {
            Console.WriteLine("B.F");
        }
        public override void G()
        {
            Console.WriteLine("B.G");
        }
    }
    class Test
    {
        static void Main(string[] args)
        {
            B b = new B();
            A a = new A();
            a.F();
            b.F();
            a.G();
            b.G();
            a = b;
            a.F();
            b.F();
            a.G();
            b.G();
        }
    }
}以下是B类中一段代码 new public void F()
   {
      Console.WriteLine("B.F");
   }
如果把上面的一段改为public void F()
   {
      Console.WriteLine("B.F");
   }
运行结果还是一样
A.FB.FA.GB.G
A.F
B.F
B.G
B.G
有谁能给我解释其中的原因吗

解决方案 »

  1.   

    new是隐藏基类的方法,如果一个方法没有指定new/override修饰符,默认为new
    所谓隐藏,就是指
      B b = new B(); 
      A a = new A(); 
      a = b; 
    或者
      A a = new B();
    这时候无论制定a是A类型还是B类型,都去调用B类型的方法(B类型中的方法“替换”了A类型中同名方法),失去了多态性。
      

  2.   

    无论指定a是A类型还是B类型
      

  3.   

    Sorry,好像不能叫“失去了多态性”……(今天怎么这么冲动啊……)