基底類別 `virtual` + 衍生類別 `override`,執行期依實際型別分派:
class Parent { public virtual void Msg() => Console.WriteLine("Parent"); }
class Child1 : Parent { public override void Msg() => Console.WriteLine("Child_1"); }
class Child2 : Parent { public override void Msg() => Console.WriteLine("Child_2"); }
Parent o1 = new Child1();
Parent o2 = new Child2();
o1.Msg(); // Child_1
o2.Msg(); // Child_2
衍生類別定義**相同簽名**非虛擬成員,遮蔽基底成員:
class Parent { public void Msg() => Console.WriteLine("Parent"); }
// 建議加 new 明確隱藏意圖 (否則編譯警告 CS0108)
class Child1 : Parent { new public void Msg() => Console.WriteLine("Child_1"); }
// 未加 new 也可用,但有警告
class Child2 : Parent { public void Msg() => Console.WriteLine("Child_2"); }
Parent o1 = new Child1(); o1.Msg(); // Parent (靜態繫結)
Parent o2 = new Child2(); o2.Msg(); // Parent
Child1 o3 = new Child1(); o3.Msg(); // Child_1
Child2 o4 = new Child2(); o4.Msg(); // Child_2
| 特性 | 多型 (virtual/override) | 隱藏 (new) |
|---|---|---|
| 基底成員 | 必須 `virtual`/`abstract` | 任何非私有成員 |
| 衍生關鍵字 | `override` | `new` (建議) |
| 繫結時機 | 執行期 (動態) | 編譯期 (靜態) |
| 基底參考呼叫 | 執行衍生實作 | 執行基底實作 |
| 設計意圖 | 擴充/修改行為 | 取代/遮蔽、版本相容 |