using System;
abstract class Parent {
// 抽象方法:隱含 virtual,不可加 static/virtual
public abstract void Method1();
// 抽象類別可包含非抽象成員
public void Method2() { Console.WriteLine("Method2"); }
// 甚至可包含靜態成員
public static void Method3() { Console.WriteLine("Method3"); }
}
class Child : Parent {
// 必須用 override 實作
public override void Method1() { Console.WriteLine("Method1"); }
}
class Program {
static void Main() {
Parent.Method3(); // 靜態成員透過類別呼叫
Child.Method3(); // 衍生類別也可呼叫基底靜態成員
Parent obj = new Child(); // 多型
obj.Method1(); // Method1
obj.Method2(); // Method2
Console.ReadKey();
}
}
若中間類別同樣宣告為 abstract,則可延遲實作:
abstract class Parent {
public abstract void Method1();
}
abstract class Child1 : Parent {
// 不實作 Method1,繼續保持抽象
}
class Child2 : Child1 {
// 最終具象類別必須實作所有抽象成員
public override void Method1() { Console.WriteLine("Method1"); }
}
class Program {
static void Main() {
Parent obj = new Child2();
obj.Method1(); // Method1
Console.ReadKey();
}
}
| 特性 | 抽象方法 | 虛擬方法 | 介面方法 |
|---|---|---|---|
| 必須實作 | 是(除非衍生類別也為 abstract) | 否(可選擇覆寫) | 是(實作介面的類別) |
| 可有預設實作 | 否 | 是 | C# 8.0+ 可有預設實作 |
| 存取修飾詞 | public/protected/internal | 同左 | 隱含 public |
| 靜態/密封 | 不可 static/sealed | 可 static/sealed | 不可 static/sealed |
abstract static void Method() → 編譯錯誤,靜態成員無法多型abstract private void Method() → 編譯錯誤,私有成員不可覆寫