Попытка понять пример шаблона стратегии Википедии с использованием нового Func <int, int, int> - PullRequest
7 голосов
/ 13 января 2010

Я смотрел на это, http://en.wikipedia.org/wiki/Strategy_pattern, и я понимаю концепцию шаблона стратегии, но может кто-нибудь немного объяснить пример C #.

Я действительно не понимаю, как и почему определения «Стратегия» в классе Context, почему это Func<T, T, T>, но тогда передаются только два параметра, например, в 8,9?

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 ]

9 голосов
/ 13 января 2010

A Func<T1,T2,TResult> является делегатом в виде:

TResult function(T1 arg1, T2 arg2)

Итак, у Func есть 2 типа аргумента и 1 тип возвращаемого значения. Поэтому при использовании функции func вы наберете

 (arg1, arg2) => return new TResult();
3 голосов
/ 13 января 2010

Func<int, int, int> - это функция, которая принимает два аргумента int и возвращает int - последний тип в определении Func - это тип возвращаемого значения.

1 голос
/ 13 января 2010

A Func<T, T1, T2> является делегатом. Делегат - это тип, представляющий одну функцию. В C # вы можете использовать такие функции вместо объявления определенного интерфейса. Если вы хотите, вы можете использовать интерфейс, который будет выглядеть примерно так:

interface IStrategy
{
     T Compute<T1, T2>();
}
0 голосов
/ 13 января 2010
...