| 特性 | 介面 | 抽象類別 |
|---|---|---|
| 關鍵字 | interface | abstract class |
| 本質 | 契約/規範/能力 | 不完整的基底實作/共享狀態 |
| 繼承關係 | 實作 (implements) | 繼承 (extends) |
| 多重實作/繼承 | 支援多重實作 | 單一繼承 |
| 成員實作 | C# 8.0 前:不可有實作 C# 8.0+:可有預設實作 | 可有完整實作、虛擬方法、抽象方法 |
| 存取修飾詞 | 隱含 public,不可標註 | 可用 public/protected/private/internal |
| 欄位 | 不可有實例欄位(可有靜態常數) | 可有實例欄位、屬性、事件 |
| 建構函式 | 不可有 | 可有 (供衍生類別呼叫) |
| 實例化 | 不可直接實例化 | 不可直接實例化 |
IFly 可被鳥、飛機、超人實作class Duck : IFly, ISwim, IQuack
interface IAnimal : IEat, ISleep
void IFly.Fly() { ... } 僅能透過介面參考呼叫,成員為 private
abstract 延遲實作
abstract 方法強制衍生類別實作
// 介面:定義能力
public interface IFly
{
void Fly();
int MaxAltitude { get; }
}
// 抽象類別:共享飛行邏輯與狀態
public abstract class FlyingObject : IFly
{
protected int _fuel;
public int Fuel => _fuel;
public abstract int MaxAltitude { get; }
public void Fly()
{
if (_fuel <= 0) throw new InvalidOperationException("燃料耗盡");
Console.WriteLine($"飛行中... 剩餘燃料 {_fuel}");
_fuel -= 10;
}
protected virtual void Refuel(int amount) => _fuel += amount;
}
// 具體類別
public class Airplane : FlyingObject
{
public override int MaxAltitude => 12000;
public Airplane() => _fuel = 1000;
}
public class Bird : FlyingObject
{
public override int MaxAltitude => 500;
public Bird() => _fuel = 50;
protected override void Refuel(int amount)
{
Console.WriteLine("鳥類覓食補充能量");
base.Refuel(amount);
}
}
// 另一個介面
public interface ISwim { void Swim(); }
// 多重實作
public class Duck : FlyingObject, ISwim
{
public override int MaxAltitude => 100;
public void Swim() => Console.WriteLine("鴨子游泳");
public Duck() => _fuel = 30;
}
public interface ILogger
{
void Log(string message); // 必須實作
// 預設實作:衍生類別可選擇覆寫
void LogInfo(string message) => Log($"[INFO] {message}");
void LogError(string message) => Log($"[ERROR] {message}");
// 靜態成員(不屬於介面契約)
static ILogger CreateConsoleLogger() => new ConsoleLogger();
// 私有輔助方法
private string Format(string level, string msg) => $"[{level}] {msg}";
}
I 前綴(IRepository),抽象類別可加 Base/Abstract 後綴理解介面與抽象類別的本質差異,是設計彈性、可維護、可測試物件導向系統的關鍵能力。