介面定義「契約」:規範型別必須提供的成員簽章,不包含實作細節。本文系統解析介面核心特性、語法規則、多重實作機制,並修正原文程式碼錯誤提供可編譯範例。
| 特性 | 說明 |
|---|---|
| 不可實例化 | 介面無建構子,無法 new IMyInterface(),只能由實作類別實例化 |
| 僅含宣告 | 成員只能有簽章 (方法、屬性、事件、索引子),不能有實作邏輯 (C# 8.0 前) |
| 模板契約 | 實作類別自動擁有介面定義的所有成員特徵 |
| 支援多重實作 | 類別可實作多個介面,彌補 C# 單一繼承限制 |
// 定義介面
public interface ISampleInterface
{
// 索引子
string this[int index] { get; set; }
// 事件
event EventHandler SampleEvent;
// 方法
void Find(int value);
// 屬性
string Point { get; set; }
}
// 實作介面
public class SampleImplementation : ISampleInterface
{
private string _point;
private Dictionary _data = new();
// 索引子實作
public string this[int index]
{
get => _data.TryGetValue(index, out var val) ? val : null;
set => _data[index] = value;
}
// 事件實作
public event EventHandler SampleEvent;
protected virtual void OnSampleEvent()
{
SampleEvent?.Invoke(this, EventArgs.Empty);
}
// 方法實作
public void Find(int value)
{
// 實作邏輯...
Console.WriteLine($"Finding: {value}");
}
// 屬性實作
public string Point
{
get => _point;
set => _point = value;
}
}
| 維度 | 介面 | 抽象類別 |
|---|---|---|
| 繼承限制 | 多重實作 | 單一繼承 |
| 建構子 | 無 | 可有 (protected) |
| 欄位 | 無 (C# 8.0 前) | 可有 |
| 方法實作 | C# 8.0+ 可有預設實作 | 可有虛擬/抽象/實作方法 |
| 存取修飾詞 | 預設 public,不可私有 | 完整支援 |
| 適用場景 | 定義能力契約 (可被多種型別實作) | 共享實作邏輯的型別階層 |
public interface ILogger
{
void Log(string message);
// 預設實作:實作類別可選擇覆寫
void LogWarning(string message) => Log($"WARNING: {message}");
void LogError(string message) => Log($"ERROR: {message}");
}
// 實作類別只需實作核心 Log 方法
public class ConsoleLogger : ILogger
{
public void Log(string message) => Console.WriteLine($"[LOG] {message}");
// LogWarning、LogError 自動獲得預設實作
}
// ❌ 違反 ISP:胖介面
public interface IRepository
{
void Add(object entity);
void Delete(object entity);
void Update(object entity);
IEnumerable
public class MyClass : IInterface1, IInterface2
{
// 隱式實作:公開可見
public void MethodA() { Console.WriteLine("Implicit"); }
// 顯式實作:只能透過介面參考存取
void IInterface1.MethodB() { Console.WriteLine("Explicit I1"); }
void IInterface2.MethodB() { Console.WriteLine("Explicit I2"); }
}
// 使用
var obj = new MyClass();
obj.MethodA(); // 隱式
((IInterface1)obj).MethodB(); // 顯式 I1
((IInterface2)obj).MethodB(); // 顯式 I2
介面是 C# 實現多型、解耦、契約導向設計的核心機制。掌握「僅含宣告」、「多重實作」、「介面隔離」、「顯式實作」、「預設實作 (C# 8+)」等特性,能設計出高內聚、低耦合、可測試、可擴充的系統架構。