直接看代码
基类
Code
class BasicClass
{
public virtual void VirtualMethod()
{
//.
}
public void NewMethod()
{
//.
}
}
继承类
Code
class ExtendClass:BasicClass
{
public override void VirtualMethod()
{
//..
}
public new void NewlMethod()
{
//..
}
}
Main
Code
class MainClass
{
static void Main(string[] agrs)
{
BasicClass c = new ExtendClass();
c.VirtualMethod();
c.NewMethod();
}
}
问题来了,在main中,
调用VirtualMethod时,调用的是继承类种重写的方法.
而调用隐式继承NewMethod时,则是调用的基类中的方法.
为什么呢?
因为你在ExtendClass中使用了new关键字
new关键字的作用是打断继承链
因此当你调用c.NewMethod()时,从BasicClass(编译期类型)开始延继承链查找,目标是运行期 类型(你的示例中就是ExtendClass),查找这条链上的所有NewMethod的实现
但是发现ExtendClass中使用的是new,因此继承链在ExtendClass的上一级停止,也就是停在了BasicClass中,调用了BasicClass的方法
你可以试试把ExtendClass的NewMethod的new去掉
然后加第三个类
public class ThirdClass : ExtendClass {
public new void NewMethod() { //... }
}
Main函数中写
BasicClass c = new ThirdClass();
c.NewMethod();
如果我没理解错,你应该会发现调用的依旧是ExtendClass,这是因为在ThirdClass中打断继承链,因此方法继承链停在ThirdClass的上一级,也就是ExtendClass
因为你使用的是 BasicClass.你换成ExtendClass 看看.
因为用了override,所以指向子类的函数入口地址。
那个new的,你必须用子类类型去调用才能调用得到的,用父类类型调用,还是父类的方法。