基类不能修改的类的基类方法



我正在使用实体框架生成一个"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
}

有没有办法做到这一点,或者我应该采用现有的设计?

您可以将它们写成扩展方法:

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

我会在这里进行一些依赖注入。IDemorize定义了4个方法,其中2个方法在整个框架中具有通用实现。我要做的是:从IDemoriale中提取一个新接口,并向实现该接口的对象添加一个依赖项到CClass中。

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

向CClass添加一个对象IDemolizeBase,并定义一个构造函数,用于注入依赖

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);
    }
}

这将允许您创建一个或n类来实现IDemolizeBase,这样,如果您在某些特殊情况下获得了一些特殊的实现,您就可以注入一个特殊的依赖项。

干杯,

Raphael

最新更新