作者在嘗試 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(單一繼承限制)。