public,不得加存取修飾詞public、非 staticusing System;
interface ICalculator {
int Square(int x);
}
class Calculator : ICalculator {
public int Square(int x) => x * x;
}
class Program {
static void Main() {
Calculator calc = new Calculator();
Console.WriteLine(calc.Square(3)); // 9
// 多型:介面參考指向具象實例
ICalculator iface = new Calculator();
Console.WriteLine(iface.Square(3)); // 9
Console.ReadKey();
}
}
| 情境 | 建議 |
|---|---|
| 需要共用欄位/建構函式/私有方法 | 抽象類別 |
| 定義能力契約,跨越不同繼承體系 | 介面 |
| 單一繼承限制下需混入多種行為 | 介面 |
| 版本演進需保持二進位相容 | 抽象類別(或 C# 8.0+ 介面預設實作) |
| 結構體需支援多型 | 介面(結構不可繼承類別) |
interface IA { void M(); }
interface IB : IA { void N(); }
interface IC : IA { void P(); }
interface ID : IB, IC { void Q(); } // IA 只出現一次,無菱形衝突
class Impl : ID {
public void M() { }
public void N() { }
public void P() { }
public void Q() { }
}
C# 介面繼承僅合併成員簽章,不涉及實作,因此不存在菱形繼承問題。
I 開頭:IRepository、IDisposableIEnumerable、IComparable、ISerializableInterface 後綴(如 RepositoryInterface)
// 生產程式碼
public class OrderService {
private readonly IOrderRepository _repo;
public OrderService(IOrderRepository repo) => _repo = repo; // 建構函式注入
public Order GetOrder(int id) => _repo.GetById(id);
}
// 單元測試
[Test]
public void GetOrder_ReturnsOrder_WhenExists() {
var mockRepo = new Mock();
mockRepo.Setup(r => r.GetById(1)).Returns(new Order { Id = 1 });
var svc = new OrderService(mockRepo.Object);
var order = svc.GetOrder(1);
Assert.AreEqual(1, order.Id);
}
介面是單元測試與 Mock 框架運作的基石,務必對依賴抽象而非具象。