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

 

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章