暗影与重写?

时间:2011-07-27 18:43:16

标签: c#-4.0

这是msdn中与阴影和覆盖相关的示例之一:

using System;

namespace test
{
    class A
    {
        public void F() { Console.WriteLine("A.F"); }
        public virtual void G() { Console.WriteLine("A.G"); }
    }
    class B : A
    {
        new public void F() { Console.WriteLine("B.F"); }
        public override void G() { Console.WriteLine("B.G"); }
    }
    class Test
    {
        static void Main()
        {
            B b = new B();
            A a = b;
            a.F();
            b.F();
            a.G();
            b.G();

            Console.WriteLine();
        }
    }
}


A.F();
B.F();
B.G();
B.G();

I was expecting the out put will be 
B.F(); //change is here
B.F();
B.G();
B.G();

因为A a = b; a保存b对象引用,因此它有一个调用派生类函数。

为什么A的功能被调用?

1 个答案:

答案 0 :(得分:0)

在运行时,虽然a确实是B类型的变量,但它显式是A类型的变量(A a = b;),因此在运行时因为a被声明为类型A,调用A的F()方法。

希望这有帮助!

N.S。