共享虚拟方法实现

本文关键字:实现 方法 虚拟 共享 | 更新日期: 2023-09-27 18:30:01

示例代码大大简化了。要点是,我们有一个广泛使用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()));
  }
...
}

所有的抽象基(目前)都独立地实现两种算法中的一种。其中一个只关注ImplementationName,而另一个则包括FeaturePattern测试。我想集中维护算法。

我特别感兴趣的是一种方式,它不会像ImplementationName或FeatureName的扩展方法那样,将算法暴露给主机应用程序直接使用。

共享虚拟方法实现

实现这一点的一种方法是为基类创建一个基类。例如:

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#程序员,但你明白了。