共享虚拟方法实现

时间:2013-09-03 20:45:59

标签: c# design-patterns mef

示例代码非常简化。要点是,我们有一个广泛使用MEF的项目。每个基于MEF的接口都实现IPlugin:

public interface IPlugin
{
   ImplementationName ImplementationName {get;}
   bool TryProvide(FeatureName name);
}
public interface IFoo : IPlugin ...
public interface IBar : IPlugin ...

所有接口都有一个抽象的基础实现

public abstract class FooBase : IFoo 
{
  public abstract ImplementationName ImplementationName {get;}
  protected virtual Regex FeaturePattern {get;}
  public virtual bool TryProvide(FeatureName name)
  {
      return name.ToString() == ImplementationName.ToString() 
        || (FeaturePattern != null && FeaturePattern.IsMatch(name.ToString()));
  }
...
}

所有抽象基础(当前)独立地实现2种算法中的一种。 One只查看ImplementationName,而另一个包含FeaturePattern测试。我想集中维护算法。

我特别感兴趣的是一种不会将算法公开给主机应用程序直接使用的方法,比如ImplementationName或FeatureName的扩展方法。

1 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是为基类创建基类。例如:

public abstract class BazBase : IPlugin
{
    public abstract ImplementationName ImplementationName {get;}
    protected virtual Regex FeaturePattern {get;}
    public abstract TryProvide(FeatureName name);
    protected virtual bool ImplementationNameTest(FeatureName name)
    {
        return name.ToString() == ImplementationName.ToString();
    }
    protected virtual bool FeaturePatternTest(FeatureName name)
    {
        return FeaturePattern != null && FeaturePattern.IsMatch(name.ToString());
    }
}

然后你可以:

public abstract class FooBase : BazBase, IFoo
{
    public virtual bool TryProvide(FeatureName name)
    {
        return ImplementationNameTest(name) || FeaturePatternTest(name);
    }
}

有些语法可能有误,我不是C#程序员,但你明白了。