方法在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