c#:扩展接口的功能,使其向后兼容

时间:2013-07-24 08:01:27

标签: c# backwards-compatibility

我有一个名为IEvaluator的接口,作为我创建的库的一部分。

public interface IEvaluator<T>
{
    public bool Evaluate<T>(T key, T value);
}

之前它曾用于评估密钥是否等于值。现在,我希望增加对更多运营商的支持,比如说小于,大于等同时保持向后兼容,即只有那些想要扩展支持的人应该更新他们的代码而不是其他人。我知道.NET提供了一个名为IComparer<T>的类似接口,但使用它不是一个选项。

我试过很少接近,但他们似乎没有工作

  • 将运算符作为默认参数。

    public interface IEvaluator<T>
    { 
        public bool Evaluate<T>(T key, T value, string operatorVal = "=");
    }
    
  • 在界面中添加新方法,并使用扩展方法提供其实现。

    public interface IEvaluator<T>
    { 
        public bool Evaluate<T>(T key, T value);
        public bool Evaluate<T>(T key, T value, string operatorVal = "=");
    }
    
    public static class ExtensionMethods
    {
        public static bool Evaluate<T>(this.IEvaluator evaluator, T key, T value, string operatorVal = "=")
        {
            return evaluator.Evaluate(key, values);
        }
    }
    

在这两种情况下,我都知道默认参数的函数没有实现。进行这种增强的正确方法是什么?

1 个答案:

答案 0 :(得分:8)

基本上,你不能。如果有人实现原始界面,他们的代码不会暴露任何使用其他运算符的方式...所以你不能暴露额外的方法而不破坏他们的代码。

一种选择是创建一个 new 接口,扩展旧接口:

public interface IFlexibleEvaluator<T> : IEvaluator<T>
{ 
    bool Evaluate<T>(T key, T value, string operatorVal);
}

然后实施可以在闲暇时增加支持。他们可以自己执行“默认为平等”部分。

相关问题