【c# 學習筆記】使用virtual和override關鍵字實現方法重寫


  只有基類成員聲明為virtual或abstract時,才能被派生類重寫;而如果子類想改變虛方法的實現行為,則必須使用override關鍵字。

    public class Animal
    {
        private int _age;

        public int Age
        {
            get { return _age; }
            set
            {
                //這里假設牛的壽命為10年。

                if(value <0 ||value >10)
                {
                    throw (new ArgumentOutOfRangeException("AgeIntPropery", value, "年齡必須在0-10之間"));
                   
                }
                _age = value;
            }
        }

        //幾乎所有動物都具備發出聲音的能力
        /// <summary>
        /// 但是對於動物來說,每個動物發出的聲音都不一樣
        /// </summary>
        public virtual void Voice()
        {
            Console.WriteLine("動物開始發出聲音");
        }
    
        //馬(子類)

        public class Horse:Animal
        {
            //通過override關鍵字來重寫父類方法
            public override void Voice()
            {
                base.Voice();
                Console.WriteLine("馬兒發出嘟...嘟....嘟....的聲音");
            }

        }

        //羊 (子類)
        public class Sheep:Animal
        {
            public override void Voice()
            {
          //調用基類方法
base.Voice(); Console.WriteLine("羊發出咩...咩...咩...的聲音"); } }
        static void Main(string[] args)
        {

            Animal horse = new Horse();
            horse.Voice();

            Animal sheep = new Sheep();
            //相同類型的對象調用相同的方法表現出不同的行為
            sheep.Voice();
            Console.Read();
        }

  通過使用virtual關鍵字,把需要在子類中表現為不同行為的方法定義為虛方法,然后在子類中使用override關鍵字對基類方法進行重寫。這樣,每個基類在調

用相同的方法時將表現出不同的行為,這段代碼正是c#中多態的實現。

  若子類還想繼續訪問基類定義的方法,則可以使用Base關鍵字來完成調用。

  

  如圖運行結果可以看出,相同類型的對象調用相同的方法確實表現了不同的行為,這就是多態的精髓所在。

  但是,上面的代碼還存在一個問題;我們可以通過new操作符創建Animal基類的實例,可Animal基類的作用是為所有子類提供公共成員,它是一個

抽象的概念,在實際的系統中我們希望能避免創建該類的實例。該怎么做?

  對應c#,可以使用abstract關鍵字來防止在代碼中直接創建這樣的類的實例,如下:

 

       public abstract class Animal
        {
          
            .....

        }

  

 

醬紫 ,若嘗試創建Animal實例,就會收到如下所示報錯。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM