3

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

どちらの場合も、デフォルト引数を持つ関数が実装されていないことがわかりました。そのような種類の強化を行う正しい方法は何ですか?

4

1 に答える 1

10

基本的に、できません。誰かが元のインターフェイスを実装している場合、そのコードは他の演算子を使用する方法を公開していません...そのため、コードを壊さずに追加のメソッドを公開することはできません。

1 つのオプションは、古いインターフェイスを拡張した新しいインターフェイスを作成することです。

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

その後、実装は自由にサポートを追加できます。彼らは「デフォルトから平等へ」の部分を自分で実行できます。

于 2013-07-24T08:05:22.177 に答える