2012-07-26 58 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,所以,在如果你在某些特殊情况下得到了一些特殊的实现,你可以注入一个特殊的依赖。

干杯,

拉斐尔