2010-01-12 4 views
7

Ich sah dies, http://en.wikipedia.org/wiki/Strategy_pattern und ich verstehe das Konzept der Strategie Muster, aber könnte jemand das C# Beispiel ein wenig zu erklären.Versuchen, das Wikipedia-Strategie-Muster Beispiel mit neuen Func zu verstehen <Int, Int, Int>

Ich bekomme nicht wirklich das Wie und Warum der Definition von 'Strategie' in der Context-Klasse, warum ist es Func<T, T, T>, aber dann nur zwei Parameter in zB 8,9 übergeben?

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

Antwort

9

A Func<T1,T2,TResult> ist eine Delegierten in Form von:

TResult function(T1 arg1, T2 arg2) 

so die Func hat 2 Argumenttypen und 1 Rückgabetyp. Deshalb, wenn die func raubend, werden geben Sie

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

Meinen Sie: T-Funktion (T1 arg1, arg2 T2)? –

+0

Sie können 'T' nennen, was Sie wollen, also hier' TResult' zur besseren Erklärung. –

3

Func<int, int, int> eine func ist, die zwei Argumente int nehmen und gibt einen int - die letzte Art in einer Func Definition ist der Rückgabetyp.

+1

Nicht generell, immer. –

1

Ein Func<T, T1, T2> ist ein Delegierter. Ein Delegat ist ein Typ, der eine einzelne Funktion darstellt. In C# können Sie Funktionen wie diese verwenden, anstatt eine bestimmte Schnittstelle zu deklarieren. Wenn Sie möchten, können Sie eine Schnittstelle verwenden, die in etwa so aussehen würde:

interface IStrategy 
{ 
    T Compute<T1, T2>(); 
} 
Verwandte Themen