【发布时间】:2013-07-24 08:01:27
【问题描述】:
我有一个名为IEvaluator 的接口作为我创建的库的一部分。
public interface IEvaluator<T>
{
public bool Evaluate<T>(T key, T value);
}
之前它用于评估 key 是否等于 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); } }
在这两种情况下,我都知道带有默认参数的函数没有实现。进行这种增强的正确方法是什么?
【问题讨论】:
-
如果您修改
IEvaluate<T>,您的所有用户都需要实现新接口。创建实现高级功能的派生接口。例如IEvaluteMath<T>.
标签: c# backwards-compatibility