类继承中的 隐藏和重写的 区别

我看先看一个例子:

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有被重写了,于是调用了被重写后的方法。

有不妥当的地方,请批评指正。

posted on 2014-08-29 16:22  wanglgkaka  阅读(243)  评论(0编辑  收藏  举报

导航