2010-01-12 2 views
7

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

Я действительно не понимаю, как и почему определение «Стратегия» в классе 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); 
    } 
} 

ответ

9

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

TResult function(T1 arg1, T2 arg2) 

так, то Func имеет 2 типа аргумента, а возвращаемое 1 типа. Поэтому, когда потребляя FUNC, вы будете вводить

(arg1, arg2) => return new TResult(); 
+0

Вы имеете в виду: T function (T1 arg1, T2 arg2)? –

+0

Вы можете назвать 'T' все, что хотите, поэтому здесь' TResult' для лучшего объяснения. –

3

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

+1

Не в общем, всегда. –

1

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

interface IStrategy 
{ 
    T Compute<T1, T2>(); 
} 
Смежные вопросы