首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 介面基礎:契約定義、隱式實作與多型替換

     編輯:關於C語言

介面核心特性速覽

  • 僅宣告成員簽章,不包含實作(C# 8.0 前)
  • 不能實例化,不能包含欄位、建構函式、解構函式
  • 成員隱含 public,不得加存取修飾詞
  • 可包含:方法、屬性、事件、索引子
  • 類別、結構、介面皆可實作/繼承多個介面
  • 實作類別必須實現所有成員(除非為抽象類別)
  • 實作成員必須是 public、非 static

入門範例

using 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();
    }
}

介面 vs 抽象類別:快速選擇

情境建議
需要共用欄位/建構函式/私有方法抽象類別
定義能力契約,跨越不同繼承體系介面
單一繼承限制下需混入多種行為介面
版本演進需保持二進位相容抽象類別(或 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、IDisposable
  • 形容詞尾綴:IEnumerable、IComparable、ISerializable
  • 避免 Interface 後綴(如 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 框架運作的基石,務必對依賴抽象而非具象。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved