interface IA
    {        void Foo();    }    class CA : IA
    {        public void Foo()
        {            Console.WriteLine("AAAAAAAAAAAAAAAAAAAAAAAAA");        }    }    class CB : CA, IA
    {        public new void Foo()
        {            Console.WriteLine("+++++++++++++++++++++");        }    }    class Test
    {        public static void InvokeFoo(CA ia)
        {            ia.Foo();        }        public static void Main()
        {
            
            InvokeFoo(new CA());            InvokeFoo(new CB());
            
        }
    }

解决方案 »

  1.   

    恩。。我知道是2行AAAA请说明为什么。谢谢。。
      

  2.   

    public static void InvokeFoo(CA ia) 
    {
          ia.Foo();
    }上面的这个方法接收一个CA类型作为参数,那么里面ia.Foo();方法自然就是调用CA类中的Foo()方法,
    第一个InvokeFoo(new CA()); 就输出了一行AAAA..
    第二个InvokeFoo(new CB()); ,它创建了一个CB类的实例,由于CB类又是CA类的子类,所以,在执行这个方法的时候,
    CB类实例的类型被自动转换为CA类的类型,故又一次执行了CA类中的Foo()方法,再次输出一行AAA...
      

  3.   

    C# 用 new 构造一个对象,首先是将 对象的属性构造出来,然后将方法表指针引用添加到对象中
    InvokeFoo(new CB()); 
    因为 
    public static void InvokeFoo(CA ia)所以  new CB() 构造出来的是一个 CA 类型的实例..所以你 new CB()获取的对象中的属性包含CA的属性和CB的属性,但是方法表指向的是 CA 类型的方法表懂了没?,   \不懂就说
    等分
      

  4.   

    第一行就不说了。
    第二行是因为CB继承了CA并用new隐藏了CA的方法Foo.
    当InvokeFoo(new CB())时候,实际调用的是父类CA的方法
    关键是new....