C# Orverride

  • 12293
  • 0
  • C#
  • 2020-06-15

此為個人學習筆記,如果有理解錯誤或是相關資訊歡迎留言告知與分享,謝謝!

參考影片: 小山的 C# 教學

什麼是override?

  • 覆蓋掉 被繼承的base class 中的方法或屬性

用到的場合?

  • 需要base class內的東西,但有些部分與base class的屬性或方法不同
  • 常用於多型,讓許多相同的method具有不同的行為(使用場合??)

怎麼寫?

  • 方法的名稱與參數要完全相同
  • derived class的方法要加 override
  • base class的方法要加virtual

=================================================================

e.g.,

原本使用繼承的程式碼

//base class

class People

    {

        public string Say()

        {

            return "People類別內的Say";

        }

    }



//derived class    

class Program : People

    {

        static void Main(string[] args)

        {

            Program p = new Program();

            Console.WriteLine("這是哪裡的say()?\n"+ p.Say());

           Console.ReadKey();

        }

     }

 

印出結果

這是哪裡的say()?

People類別內的Say

 

=================================================================

繼承並寫ovrride的程式碼

//base class

class People

    {

        public virtual string Say()

        {

            return "People類別內的Say";

        }

    }



//derived class    

class Program : People

    {

        public override string Say()

        {

            return "Program內override的Say";

        }



        static void Main(string[] args)

        {

            Program p = new Program();

            Console.WriteLine("這是哪裡的say()?\n"+ p.Say());

           Console.ReadKey();

        }

     }

印出結果

這是哪裡的say()? 

Program內override的Say

 

=================================================================

為什麼不要再多寫個method就好,要用override呢?

//base class

//和 "繼承並寫ovrride的程式碼 "的base class相同,懶得再複製貼上


 

//derived class

class Program : People

    {

        public override string Say()

        {

            return "Program內override的Say";

        }



        public string Say1()

        {

            return "Program的Say1";

        }



        static void Main(string[] args)

        {

            Program p = new Program();

            People a = p;

            //_____為空白.以下討論

            Console.WriteLine("這是哪裡的say()?\n"+ _____ );

        }

    }

  • _____ = p.Say1();

           印出結果

          這是哪裡的say()?

          Program的say1

  • _____ = a.Say1();

           會出現紅底線

           因為Say1()是Program內的方法,

   所以若用 People 宣告 a時,沒有這個方法

   但若用override則不會出現此問題。

 

 


之後需補充

 

abstract 抽象類別......

override 屬性也可用

this / base (ex: this.Say())