代码如下
    public class Father
    {
        public void DoWork()
        {
            Console.WriteLine("Father.DoWork()");
        }        public virtual void DoVirtualWork()
        {
            Console.WriteLine("Father.DoVirtualWork()");
        }        public virtual void DoVirtualAll()
        {
            Console.WriteLine("Father.DoVirtualAll()");
        }
    }    public class Son : Father
    {
        public static void DoStaticWork()
        {
            Console.WriteLine("Son.DoStaticWork()");
        }        public new void DoWork()
        {
            Console.WriteLine("Son.DoWork()");
        }        public new virtual void DoVirtualWork()
        {
            base.DoVirtualWork();
            Console.WriteLine("Son.DoVirtualWork()");
        }        public override void DoVirtualAll()
        {
            Console.WriteLine("Son.DoVirtualAll()");
        }
    }    public class Grandson : Son
    {
        public override void DoVirtualWork()
        {
            base.DoVirtualWork();
            Console.WriteLine("Grandson.DoVirtualWork()");
        }        public override void DoVirtualAll()
        {
            base.DoVirtualAll();
            Console.WriteLine("Grandson.DoVirtualAll()");
        }
    }    
    class IL_Method_Test
    {
        public static void Main()//Main_3_5_2
        {
            
            Father son = new Son();
            son.DoWork();
            son.DoVirtualWork();            if (son is Father)
            {
                Console.WriteLine("He is right.");
            }            Son.DoStaticWork();            Father aGrandSon = new Grandson();
            aGrandSon.DoWork();
            aGrandSon.DoVirtualWork();
            aGrandSon.DoVirtualAll();
            Console.Read();            
        }
    }

解决方案 »

  1.   

    这段代码要理解C#的多态性才能很好地理解:
    1. 非虚方法(Father.DoWork)不具有多态性,因为它不能被override
    2. 用new修饰的方法,在编译期按变量类型调用.(如Father类型的变量son.DoWork(), aGrandSon.DoWork();)
    3. is 操作符会在运行期检查变量的实际类型是否是右边的或它的子类型.(所以he is right.)
    4. 静态方法总是按类型调用.
    5. "aGrandSon.DoVirtualWork();" 我也没搞明白:)
    6. "aGrandSon.DoVirtualAll();"体现了多态性.它的base是Son.DoVirtualAll.尽管变量类型Father.
      

  2.   

    "用new修饰的方法,在编译期按变量类型调用"
    "静态方法总是按类型调用. "
    这两句话什么意思??
      

  3.   

    多态分编译期和运行期.
    编译期多态是指通过重载, new,及非虚定义的方法,这些方法在编译时,c#编译器就能确定下来调用哪一个.
    运行期多态是指,在运行时CLR才能确定调用它个类中的方法的技术.静态方法,非虚方法,new的方法不具有运行期多态.所以按变量类型调用.
      

  4.   

    DoVirtualAll()这个方法,在father里是virtual的,son类override了它,儿grandson再去override是覆盖谁的实现?
      

  5.   

    DoVirtualAll()这个方法,在father里是virtual的,son类是 override了它,儿grandson再去override是覆盖谁的实现?
    是override的father,重写方法不被视为是在类上进行声明的,而是在基类上声明的方法的新实现。
      

  6.   

    DoVirtualWork()这个方法,在father里是virtual的,son类是 new 了它,儿grandson再去override是覆盖son的,new隱藏了father裏面的DoVirtualWork()