zoukankan      html  css  js  c++  java
  • 类继承中的 隐藏和重写的 区别

    我看先看一个例子:

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

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

  • 相关阅读:
    [leetcode] Longest Palindromic Substring
    [leetcode] Add Two Numbers
    [leetcode] Longest Substring Without Repeating Characters
    [leetcode] Median of Two Sorted Arrays
    [leetcode] Two Sum
    poj 2718 Smallest Difference
    AOJ 0525 Osenbei
    poj3190 stall revertation
    poj1328Radar Installation
    poj 2376 Cleaning Shifts
  • 原文地址:https://www.cnblogs.com/wanglg/p/3945233.html
Copyright © 2011-2022 走看看