无法修改基类的类的基类方法?

时间:2012-07-26 07:03:52

标签: c# .net entity-framework

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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);
    }
}

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

干杯,

圣拉斐尔