感覺變成魚仔(只有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