共享虚拟方法实现
本文关键字:实现 方法 虚拟 共享 | 更新日期: 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#程序员,但你明白了。