【问题标题】:c#: Extending functionality of an interface keeping it backward compatiblec#:扩展接口的功能使其向后兼容
【发布时间】:2013-07-24 08:01:27
【问题描述】:

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

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

之前它用于评估 key 是否等于 value。现在,我想在其中添加对更多运算符的支持,比如小于、大于等,同时保持向后兼容,即只有那些想要扩展支持的人应该更新他们的代码,而不是其他人。我知道 .NET 提供了一个类似的接口,称为 IComparer&lt;T&gt;,但在这里使用它不是一个选项。

我尝试了一些方法,但似乎没有一个有效

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

    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);
        }
    }
    

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

【问题讨论】:

  • 如果您修改IEvaluate&lt;T&gt;,您的所有用户都需要实现新接口。创建实现高级功能的派生接口。例如IEvaluteMath&lt;T&gt;.

标签: c# backwards-compatibility


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    相关资源
    最近更新 更多