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

C# 介面 深度解析:定義、特性、多重實作與程式碼範例

     編輯:關於C語言

前言

介面定義「契約」:規範型別必須提供的成員簽章,不包含實作細節。本文系統解析介面核心特性、語法規則、多重實作機制,並修正原文程式碼錯誤提供可編譯範例。

介面四大核心特性

特性說明
不可實例化介面無建構子,無法 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;
    }
}

介面 vs 抽象類別

維度介面抽象類別
繼承限制多重實作單一繼承
建構子無可有 (protected)
欄位無 (C# 8.0 前)可有
方法實作C# 8.0+ 可有預設實作可有虛擬/抽象/實作方法
存取修飾詞預設 public,不可私有完整支援
適用場景定義能力契約 (可被多種型別實作)共享實作邏輯的型別階層

C# 8.0+ 介面新功能:預設實作


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) 實務


// ❌ 違反 ISP:胖介面
public interface IRepository
{
    void Add(object entity);
    void Delete(object entity);
    void Update(object entity);
    IEnumerable GetAll();
    object GetById(int id);
    IEnumerable Find(Expression> predicate);
    // ... 20 個方法
}

// ✅ 遵循 ISP:拆分為角色介面
public interface IReadRepository
{
    IEnumerable GetAll();
    object GetById(int id);
}

public interface IWriteRepository
{
    void Add(object entity);
    void Delete(object entity);
    void Update(object entity);
}

public interface IQueryRepository
{
    IEnumerable Find(Expression> predicate);
}

// 類別只實作需要的介面
public class UserRepository : IReadRepository, IWriteRepository { ... }
public class ReadOnlyUserRepository : IReadRepository { ... }


顯式介面實作


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+)」等特性,能設計出高內聚、低耦合、可測試、可擴充的系統架構。

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