學習目標
- 實作基類與衍生類
- 衍生類初始化基類 (
base(...))
- 呼叫基類成員 (
base.方法)
- 覆寫基類成員 (
override/new)
- 衍生類轉換為基類參考
基本繼承:ParentClass / ChildClass
using System;
public class ParentClass
{
public ParentClass() => Console.WriteLine("Parent Constructor.");
public void Print() => Console.WriteLine("I'm a Parent Class.");
}
public class ChildClass : ParentClass
{
public ChildClass() => Console.WriteLine("Child Constructor.");
public static void Main()
{
var child = new ChildClass();
child.Print(); // 繼承自 ParentClass
}
}
輸出
Parent Constructor.
Child Constructor.
I'm a Parent Class.
關鍵觀察
- 建構子鏈:基類建構子先於衍生類建構子執行(輸出順序可見)。
- 成員繼承:
ChildClass 未定義 Print,直接使用 ParentClass 版本。
- 單一繼承:C# 僅支援單一基類 (
: ParentClass)。
進階:基類建構子參數與成員覆寫
public class Parent
{
private string msg;
public Parent() => Console.WriteLine("Parent Constructor.");
public Parent(string s) { msg = s; Console.WriteLine(msg); }
public virtual void Print() => Console.WriteLine("I'm a Parent Class.");
}
public class Child : Parent
{
// 呼叫基類帶參數建構子
public Child() : base("From Derived")
{
Console.WriteLine("Child Constructor.");
}
// 覆寫並呼叫基類版本
public override void Print()
{
base.Print(); // 呼叫 Parent.Print()
Console.WriteLine("I'm a Child Class.");
}
public static void Main()
{
var child = new Child();
child.Print(); // 呼叫 Child.Print() -> Parent.Print() -> Child 額外輸出
((Parent)child).Print(); // 顯式轉型為 Parent,仍呼叫 Child.Print() (虛擬方法)
}
}
輸出
From Derived
Child Constructor.
I'm a Parent Class.
I'm a Child Class.
I'm a Parent Class.
核心概念總結
| 概念 | 語法 | 說明 |
| 繼承宣告 | class Child : Base | 單一繼承 |
| 基類建構子呼叫 | : base(參數) | 衍生類建構子第一行,必須最先呼叫 |
| 呼叫基類成員 | base.Method() | 存取被覆寫/隱藏的基類實作 |
| 覆寫虛擬方法 | override | 需基類標記 virtual/abstract |
| 隱藏非虛擬成員 | new | 靜態繫結,基類參考呼叫仍執行基類版本 |
| 衍生轉基類 | (Base)derived | 安全向上轉型,虛擬方法仍依實際型別派發 |