我看先看一个例子:
public class A
{
public int a = 10;
public virtual void Fun1()
{
Console.WriteLine("1"); -------A1
}
public virtual void Fun3()
{
Console.WriteLine(this.a); -------A2
}
public void Fun2()
{
Fun3(); -------A3
}
}
public class B : A
{
public new int a = 20;
public new void Fun3()
{
Console.WriteLine(this.a); --------------B1
}
public override void Fun1()
{
Console.WriteLine("3");------------------B2
}
}
当我们执行B b = new B();
b.Fun2();的时候
执行的顺序是
A3 -----> A2 输出的结果是10
步骤A3中的Fun3() 实际是 this.Fun3(),也就是当前实例的方法。
当调用的Fun2() 在B中没有的时候 就去父类中查找,找到后就把B类的对应当作A的实例来看,
调用的是A的方法 使用的是A的变量
我们可以修改一下代码,加上this public void Fun2()
{
this.Fun3(); -------A3
}
然后debug后发现 this 的情况是
所以在Fun3被隐藏的情况下,仍然调用了当前类A自己的Fun3方法
如果继续改代码
public override void Fun3()
{
Console.WriteLine(this.a); --------------B1
}
这时候执行B b = new B();b.Fun2();的时候,
唯一变化的就是 执行完A3 后 执行 B1
这是因为A类的Fun3被重写了,当对象试图去调用A类的Fun3的时候,发现Fun3有被重写了,于是调用了被重写后的方法。
有不妥当的地方,请批评指正。