C#里的重写,淦!

先定义两个类

    public  class A
    {
        protected  void fun1()
        {
            fun2();
        }

        protected    virtual  void fun2()
        {
            Console.WriteLine("A.fun2");
        }
    }

    public  class B : A
    {
        public  void Test()
        {
            base.fun1();
        }

        protected   void fun2()
        {
            Console.WriteLine("B.fun2");
        }
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            //  CreateHostBuilder(args).Build().Run();

            B model = new B();
            model.Test();

        }

客官可猜输出是什么?

答案:  A.fun2

然而我们修改一下class.B的代码

        protected  new  void fun2()
        {
            Console.WriteLine("B.fun2");
        }
增加 new 关键词,覆盖  A的fun2
然而输出的结果还是 A.fun2
         protected   override  void fun2()
        {
            Console.WriteLine("B.fun2");
        }
客官可猜输出是什么? B.fun2

如果在java中,我们第一次的代码就直接输出 B.fun2 ,因为 java 中同名方法会重写 父类方法,但是C# 中必须明确的用虚方法和 override关键词来重写父类方法

 我们再次改一下class.B的代码

public  class B : A
    {
        public void fun1()
        {
            base.fun1();
        }

        public   void fun2()
        {
            Console.WriteLine("B.fun2");
        }
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            //  CreateHostBuilder(args).Build().Run();

            A model = new B();
            model.fun1();

        }

 改动的地方我给加粗了,词时输出的是什么?依然是  A.fun2

再改 ,输出 B.fun2

再改

 public  class B : A
    {
        public void fun1()
        {
            fun1();
        }

        public    void fun2()
        {
            Console.WriteLine("B.fun2");
        }
    }

 输出 A.fun2 

  public  class B : A
    {
        public void fun1()
        {
            fun1();
        }

        public  override   void fun2()
        {
            Console.WriteLine("B.fun2");
        }
    }

输出 B.fun2

得出一个结论,当子类重写了父类的方法后,当子类代替父类出现时都将使用子类的 方法,而不使用自己父类的方法

原文地址:https://www.cnblogs.com/netqq/p/14606906.html