C# 繼承中常用關鍵詞new、virtual和 override 使用時間點與範例

  • 12254
  • 0

感覺變成魚仔(只有7秒)學習過後,過一陣子,不使用知識久就忘了,純記錄的筆記,找錯魔人...勿入..

 

類別的繼承關係中常用的修飾詞

 關鍵字 英文/中文對照說明:

1.  virtual ... 用來修改基底方法、屬性、索引子或事件宣告,並可在衍生類別中受到覆寫。 例如,繼承這個方法的任何類別均可將其覆寫

2.  override ... 覆蓋修飾詞(搭配 基底類別方法 加入virtual ; 衍生類別方法加入override )。

3.   new ... 隱藏基底修飾詞會隱藏繼承自基底類別的成員。 當隱藏繼承的成員時,該成員的衍生版本就會取代基底類別版本

Ex : MyCreateClass MyGod = new MyCreateClass();

常見關鍵字中將   override(覆蓋基礎) 和 new(隱藏基礎) 有時都叫覆寫基礎類別方法

 

範例 :

 public class Parent  //(父)基底類別
    {
        
         //public "virtual" string Name
         //一個屬性是Name故意沒加上virtual   
         public string Name
        {
            get
            {
                return "基底類別";
                //return Name;
            }
            set
            {
                Name = value;
            }
        }

       //public "virtual" void PrintClassName()
       //一個方法PrintClassName() 故意沒加上virtual                     
        public void PrintClassName()
        {
            Console.WriteLine("基底類別名稱是 " + Name);
        }
    }

    //======================================================
    public class Derivative : Parent //(衍生)子類別
    {
       //public "override" string Name       
         public string Name //  一個屬性是Name故意沒加上override         
        {
            get
            {
                return "(衍生)子類別";               
            }
            set
            {
                Name = value;
            }
        }
       
        //public "override" void PrintClassName()        
        public  void PrintClassName()////這裡也不使用override關鍵字來覆寫
        {
            Console.WriteLine("(衍生)子類別 : " + Name);
        }
       
    }
    class Program
    {
        static void Main()
        {
            //使用new 這時子類別就會隱藏父類別的名稱的屬性和方法,當分別去執行父類別和(衍生)子類別的printClassName()時
            Parent P1 = new Parent();
            P1.PrintClassName();
            
            Derivative D2 = new Derivative(); Parent D2 = new Derivative();
            //未父類別加上了virtual修飾詞           
            //結果正確了,由上面的例子就能知道virtual和override的用法了.
            D2.PrintClassName();            
            Console.ReadKey();//讓Dos畫面可以暫停...按任一鍵結束程式。            
        }
    }

假裝忘記加virtual修飾詞,另外在子類別的屬性及方法沒加override 可執行 會產生警告,編譯器會自動加入 New 隱藏基底修飾詞

但是如果換一個方式,異常就出現了

//Derivative D2 = new Derivative(); Parent D2 = new Derivative();
//置換成
Parent D2 = new Derivative(); //這次我們會將Derivative的物件塞到Parent裡,因為(衍生)子物件塞到父類是可行的. 

如上例問題是子類別呼叫方法跟屬性並非想要呈現結果,

使用當子類別塞入父類別時異常出現了,這時候很重要有沒有加virtual and override 會導致不同的結果

1.父類別的屬性及方法加上了virtual修飾詞,

2.子類別的屬性及方法加上了override的修飾詞,

這時再重新執行一次,得到的結果如下: 想要結果

作筆記當記錄...  滑順圓潤的口感與酒香的高清水

參考文獻 : https://docs.microsoft.com/zh-tw/dotnet/csharp/language-reference/keywords/abstract

有事沒事多學,學習活在當下,做一件事情後,學會一件事就好。 JT