class Parent { public void Say() => Console.WriteLine("Parent"); }
class Child : Parent { } // 繼承
var c = new Child();
c.Say(); // "Parent" - 繼承基類方法
Object 是所有類別的終極基類。virtual 允許覆寫。override 提供新實作。class Parent { public virtual void Say() => Console.WriteLine("Parent"); }
class Child : Parent { public override void Say() => Console.WriteLine("Child"); }
Parent p = new Child();
p.Say(); // "Child" - 多型:實際型別 Child 決定呼叫
virtual (除非加 sealed override)。「一個介面,多種實作」。基類參考指向衍生類實例,呼叫虛擬方法時執行衍生類實作。
class Animal { public virtual void Speak() => Console.WriteLine("..."); }
class Dog : Animal { public override void Speak() => Console.WriteLine("Woof"); }
class Cat : Animal { public override void Speak() => Console.WriteLine("Meow"); }
var animals = new Animal[] { new Dog(), new Cat() };
foreach (var a in animals) a.Speak(); // Woof / Meow
class Parent { public void M() {} }
class Child : Parent { public void M() {} } // 警告:隱藏繼承成員
Parent p = new Child(); p.M(); // Parent.M
Child c = new Child(); c.M(); // Child.M
class Child : Parent
{
public new void M() {} // 明確意圖,無警告
}
| 特性 | 覆寫 | 隱藏 |
|---|---|---|
| 關鍵字 | virtual / override | new (可省略) |
| 綁定時機 | 執行期 (動態) | 編譯期 (靜態) |
| 基類參考行為 | 呼叫衍生類實作 | 呼叫基類實作 |
| 多型支援 | 是 | 否 |
| 適用場景 | 擴充/修改行為 | 修正基類設計、非多型情境 |
base.Method():在覆寫方法中呼叫基類實作。base.Property:存取基類屬性實作。base(...):呼叫基類建構函式。繼承提供「是一種」關係的程式碼復用;virtual/override 實現執行期多型;new 提供編譯期隱藏。理解靜態 vs 動態綁定的本質差異,是正確使用繼承、避免微妙 Bug 的關鍵。