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

 

得出一個結論,當子類重寫了父類的方法後,當子類代替父類出現時都將使用子類的 方法,而不使用自己父類的方法

 

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