日期:2014-05-17  浏览次数:20740 次

方法在new修饰符的作用下是如何调用的(子类对象赋值给父类变量)
本帖最后由 huawenxue 于 2013-11-13 17:54:56 编辑

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace IL_Method_Test
{
    public class Father
    {
        public void DoWork()
        {
            Console.WriteLine("Father.DoWork()");
        }
    }

    public class Son :Father
    {

        public new void DoWork()
        {
            Console.WriteLine("Son.DoWork()");
        }
    }

   

    class Program
    {
        static void Main(string[] args)
        {
            Father son=new Son();
            son.DoWork();
            Son newSon = new Son();
            newSon.DoWork();

            Console.Read();
        }
    }
}


第一个son.DoWork();为什么会调用父类的方法
第二个我知道原因,new覆盖了
第一个没覆盖?还是应为变量的原因,编译的时候内部有个方法表?变量时哪个类的就调用哪个类的方法?除非被子类override?,能说说原理吗

------解决方案--------------------
有两个毫无关系都叫DoWork的方法,
用基类类型访问,访问的是基类的,用子类类型访问,访问的是子类的(子类隐藏了基类的方法)。

根本不是“覆盖”。
------解决方案--------------------
你记住一点,如果父类定义了一个方法,并且没有用virtual修饰它,那么无论如何你用父类类型调用它,都没有办法调用成子类定义的那个方法。
    public class Father
    {
        public void DoWork() //不加virtual
        {
            Console.WriteLine("Father.DoWork()");
        }
    }
 
    public class Son :Father
    {
 
        public new void DoWork()
        {
            Console.WriteLine("Son.DoWork()");
        }
    }
你永远不可能试图实现
Father f