读书人

方法在new修饰符的作用下是怎么调用的

发布时间: 2013-11-15 22:28:15 作者: rapoo

方法在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 = new Son();
f.DoWork(); //调用除Father.DoWork以外的另一个方法。

读书人网 >C#

热点推荐