7

http://en.wikipedia.org/wiki/Strategy_patternを見ていて、戦略パターンの概念を理解しましたが、誰かが C# の例を少し説明してくれませんか。

Context クラスの 'Strategy' の定義の方法と理由が本当にわかりません。なぜFunc<T, T, T>ですか?

static void Main(string[] args)
{

    var context = new Context<int>();

    // Delegate
    var concreteStrategy1 = new Func<int, int, int>(PerformLogicalBitwiseOr);

    // Anonymous Delegate
    var concreteStrategy2 = new Func<int, int, int>(
        delegate(int op1, int op2)
        {
            return op1 & op2;
        });

    // Lambda Expressions
    var concreteStrategy3 = new Func<int, int, int>((op1, op2) => op1 >> op2);
    var concreteStrategy4 = new Func<int, int, int>((op1, op2) => op1 << op2);

    context.Strategy = concreteStrategy1;
    var result1 = context.Execute(8, 9);

    context.Strategy = concreteStrategy2;
    var result2 = context.Execute(8, 9);

    context.Strategy = concreteStrategy3;
    var result3 = context.Execute(8, 1);

    context.Strategy = concreteStrategy4;
    var result4 = context.Execute(8, 1);

}

static int PerformLogicalBitwiseOr(int op1, int op2)
{
    return op1 | op2;
}

class Context<T>
{
    public Func<T, T, T> Strategy { get; set; }

    public T Execute(T operand1, T operand2)
    {
        return this.Strategy != null
            ? this.Strategy(operand1, operand2)
            : default(T);
    }
}
4

4 に答える 4

9

AFunc<T1,T2,TResult>は、次の形式のデリゲートです。

TResult function(T1 arg1, T2 arg2)

したがって、Func には 2 つの引数の型と 1 つの戻り型があります。したがって、関数を使用するときは、次のように入力します

 (arg1, arg2) => return new TResult();
于 2010-01-12T22:06:32.897 に答える
3

Func<int, int, int>2 つの int 引数を取り、int を返す func です。Func 定義の最後の型が戻り値の型です。

于 2010-01-12T22:07:20.303 に答える
1

AFunc<T, T1, T2>はデリゲートです。デリゲートは、単一の関数を表す型です。C# では、特定のインターフェイスを宣言する代わりに、このような関数を使用できます。必要に応じて、次のようなインターフェイスを使用できます。

interface IStrategy
{
     T Compute<T1, T2>();
}
于 2010-01-12T22:09:12.780 に答える
0

AFunc<T, T1, T2>はデリゲートであり、どのデリゲートも匿名インターフェイスと見なすことができます

于 2010-01-12T22:09:02.643 に答える