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

C# 利用擴展方法實現介面多重繼承效果

     編輯:關於C#

C# 不支援類別多重繼承,但可透過「介面 + 擴展方法」組合,達到類似多重繼承的程式碼復用效果。本文說明核心概念、完整範例,並分享作者從 Entity Framework 實體類別重構到貧血模型的實戰心路歷程。

核心技巧:擴展方法作用於介面

public interface IMyInterface { void MethodB(); }

public static class Extensions {
    // 擴展介面,提供預設實作
    public static void MethodB(this IMyInterface myInterface) {
        Console.WriteLine("Extensions.MethodB");
    }
}

所有實作 IMyInterface 的類別(A、B、C)無需自行實作 MethodB,即可直接呼叫 a.MethodB(),執行擴展方法提供的共用邏輯。

完整可執行範例

using System;

namespace ExtensionMethodsDemo1
{
    public interface IMyInterface { void MethodB(); }

    class A : IMyInterface { }
    class B : IMyInterface { }
    class C : IMyInterface { }

    public static class Extensions
    {
        public static void MethodB(this IMyInterface myInterface)
        {
            Console.WriteLine("Extension.MethodB(this IMyInterface myInterface)");
        }
    }

    class ExtMethodDemo
    {
        static void Main()
        {
            new A().MethodB(); // 輸出擴展方法內容
            new B().MethodB();
            new C().MethodB();
        }
    }
}

實戰背景:EF 實體類別重構

  • EF 產生的實體類別繼承 EntityObject(已有父類別),無法再繼承基類。
  • 需將「充血模型」(含業務邏輯)轉為「貧血模型」(純資料),但兩種模型之間需要共用 CopyFrom 複製屬性邏輯。
  • 介面 IModelMother 定義契約,但介面無法包含實作。
  • 靈感來源:ScottGu 回信提到引入擴展方法解決此問題 → 將共用邏輯寫成介面擴展方法。

優缺點分析

優點缺點
無需多重繼承即可共用實作擴展方法為靜態,無法存取介面未公開的私有狀態
介面保持單純契約,符合 ISP 原則無法像基類那樣擁有建構函式、欄位初始化
新增共用行為不修改既有類別(OCP)IDE 智慧感應顯示為擴展方法,非實例方法

適用場景

  • 無法繼承共同基類(如 EF 實體、第三方類別)。
  • 需為多個實作相同介面的類別提供共用預設行為。
  • 想保持介面乾淨,將「可選」實作移至擴展方法。

結語

「介面定義契約,擴展方法提供預設實作」是 C# 實現類 Mixin(混入)模式的標準做法。C# 8.0 介面預設實作(default)進一步原生支援此模式,但擴展方法仍具備「不修改介面定義即可擴展」的優勢,適合第三方介面或跨組件擴展場景。

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