2012-07-26 57 views
1

我使用實體框架來產生如下一個「CClass」實體:其基類無法修改的類的基類方法?

public partial class CClass: EntityObject 
{ 
    #region Factory Method 

    #region Primitive Properties 
} 

我的部分類實現的其餘部分是

public partial class CClass : IDemoralize 
{ 
    public Value xValue { get; set; } 

    public void IDemoralize.Demoralize() 
    { 
     // implementation 

    } 
    public void IDemoralize.Demoralize(Func<IDemoralize, bool> CustomDemoralization) 
    { 
     bool success = CustomDemoralization(this); 

     if (!success) 
      throw new ApplicationException(); 
    } 

    public void IDemoralize.WriteModel() 
    { 
     // implementation 
    } 

    public void IDemoralize.WriteModel(Func<IDemoralize, bool> Write) 
    { 
     bool success = Write(this); 
     if (!success) 
      throw new ApplicationException(); 
    } 
} 

現在因爲低於此列出兩種方法確實有共同實施在整個設計中,我想將它們移到名爲DemoralizeBase的基類中,所以如果代碼需要更改,則一致性將變得易於管理。

// in DemoralizeBase 
public void Demoralize(Func<IDemoralize, bool> CustomDemoralization) 
{ 
    //implementation 
} 

public void WriteModel(Func<IDemoralize, bool> Write) 
{ 
    // implementation 
} 

有沒有辦法做到這一點,或者我應該去現有的設計?

+0

你可以解決它與一個2級繼承 – 2012-07-26 07:12:01

+1

DemoralizeBase可以從EntityObject繼承。 CClass繼承自DemoralizeBase。 – James 2012-07-26 07:12:13

回答

3

你可以寫這些爲擴展方法:

public static class Demoralize { 
    public static void Demoralize(this IDemoralize obj, 
     Func<IDemoralize, bool> CustomDemoralization) {...} 
    public static void WriteModel(this IDemoralize obj, 
     Func<IDemoralize, bool> Write) {...} 
} 

這將工作,然後彷彿它是一個實例方法,即

var foo = new CClass(); 
foo.Demoralize(...); 

有一點需要注意:調用擴展方法時在當前的情況下,this.(通常是可選的)是要求,即

Demoralize(...); // does not work 
this.Demoralize(...); // works 
+0

或者,您也可以直接調用方法並傳遞實例:「Demoralize.Demoralize(yourCClassInstance,...);」 - 我更喜歡答案中描述的語法。另請注意,傳遞給您的擴展方法的實例可以爲null。 – Martin1921 2012-07-26 07:16:36

+0

就像一個魅力。謝謝。 – kaushal 2012-07-26 09:24:14

1

我會去一些依賴注入這裏。 IDemoralize定義了4個方法,其中2個在您的框架中有共同的實現。 我會做的是:從IDemoralize中提取一個新的接口,並將一個依賴項添加到一個實現了該接口的對象到CClass中。

public interface IDemoralizeBase 
{ 
    void Demoralize(Func<IDemoralize, bool> CustomDemoralization); 
    void WriteModel(Func<IDemoralize, bool> Write); 
} 

添加對象IDemoralizeBase到CClass,並定義一個構造函數,可以讓你注入的依賴

public class CClass : IDemoralize 
{ 
    public IDemoralizeBase MyDemoralizer {get; private set;} 

    public CClass(IDemoralizeBase basicDemoralizer) 
    { 
     MyDemoralizer = basicDemoralizer; 
    } 

    public void Demoralize(Func<IDemoralize, bool> CustomDemoralization) 
    { 
     MyDemoralizer.Demoralize(CustomDemoralization); 
    } 

    public void WriteModel(Func<IDemoralize, bool> Write) 
    { 
     MyDemoralizer.WriteModel(Write); 
    } 
} 

這將讓你創建一個或ñ類實現IDemoralizeBase,所以,在如果你在某些特殊情況下得到了一些特殊的實現,你可以注入一個特殊的依賴。

乾杯,

拉斐爾