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

C# 實現多重繼承的替代方案:介面與擴充方法

     編輯:關於C語言

背景故事

作者在嘗試 Entity Framework 產生的實體類別(充血模型)時,習慣使用貧血模型(如 PetShop 架構)。為了讓兩種模型共用屬性複製邏輯,提取出介面 IModelMother,並定義 CopyFrom 方法:

public void CopyFrom(IModelMother model)
{
    this.P1 = model.P1;
    this.P2 = model.P2;
    this.P3 = model.P3;
    this.P4 = model.P4;
}

但介面無法提供方法實作,導致每個實體類別都必須重複相同程式碼。

解決方案:擴充方法

作者向 ScottGu 提問,獲得回應:C# 透過擴充方法即可達到類似多重繼承的效果。將共用邏輯寫成靜態類別的擴充方法,針對介面進行擴充:

public static class ModelExtensions
{
    public static void CopyFrom(this IModelMother target, IModelMother source)
    {
        target.P1 = source.P1;
        target.P2 = source.P2;
        target.P3 = source.P3;
        target.P4 = source.P4;
    }
}

如此一來,所有實作 IModelMother 的類別皆可呼叫 CopyFrom,無需重複實作。

補充說明

實體類別無法繼承自共同基底類別,是因為 EF 實體類別已繼承自 System.Data.Objects.DataClasses.EntityObject(單一繼承限制)。

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