使用委托代替接口

时间:2011-05-13 16:04:55

标签: c# interface delegates

我读到你可以使用接口和委托来达到同样的目的。比如,您可以使用委托代替接口。

有人能提供一个例子吗?我在简言之书中看到了一个例子,但我没记错,想要离开。

是否可以提供一些示例代码?用例?

感谢。

3 个答案:

答案 0 :(得分:8)

如果您的界面只有一个方法,那么使用委托会更方便。

比较以下示例:

使用界面

public interface IOperation
{
    int GetResult(int a, int b);
}

public class Addition : IOperation
{
    public int GetResult(int a, int b)
    {
         return a + b;
    }
}

public static void Main()
{
    IOperation op = new Addition();
    Console.WriteLine(op.GetResult(1, 2));
}

使用代理

// delegate signature.
// it's a bit simpler than the interface
// definition.
public delegate int Operation(int a, int b);

// note that this is only a method.
// it doesn't have to be static, btw.
public static int Addition(int a, int b)
{
    return a + b;
}

public static void Main()
{
    Operation op = Addition;
    Console.WriteLine(op(1, 2));
}

您可以看到委托版本略小。

使用匿名方法和`Func`委托

如果将它与内置的.NET泛型委托(Func<T>Action<T>和类似的)以及匿名方法结合使用,则可以用以下代码替换整个代码:

public static void Main()
{
    // Func<int,int,int> is a delegate which accepts two
    // int parameters and returns int as a result
    Func<int, int, int> op = (a, b) => a + b;

    Console.WriteLine(op(1, 2));
}

答案 1 :(得分:2)

代理可以像单方法接口一样使用:

interface ICommand
 {
   void Execute();
 }

delegate void Command();

答案 2 :(得分:0)

使用委托时:

public delegate T Sum<T>(T a, T b);

class Program
{
    static void Main(string[] args)
    {
        int sum = Test.Sum(new[] {1, 2, 3}, (x, y) => x + y);
    }
}

public static class Test
{
    public static int Sum<T>(IEnumerable<T> sequence, Sum<T> summator)
    {
        // Do work
    }
}

使用界面时:

public interface ISummator<T>
{
    T Sum(T a, T b);
}

public class IntSummator : ISummator<int>
{
    public int Sum(int a, int b)
    {
        return a + b;
    }
}

class Program
{
    static void Main(string[] args)
    {
        int sum = Test.Sum(new[] {1, 2, 3}, new IntSummator());
    }
}

public static class Test
{
    public static int Sum<T>(IEnumerable<T> sequence, ISummator<T> summator)
    {
        // Do work
    }
}

用例 - 提供只能执行一个操作的事物。代理是好的,因为您不必创建新类,您可以只使用具有相同签名的方法,或者甚至传递调用具有不同签名的方法的lambda。但是如果您决定使用更复杂的逻辑,接口会更灵活:

public interface IArithmeticOperations<T>
{
    T Sum(T a, T b);
    T Sub(T a, T b);
    T Div(T a, T b);
    T Mult(T a, T b);
    //
}

public class IntArithmetic : IArithmeticOperations<int>
{
    public int Sum(int a, int b)
    {
        return a + b;
    }

    public int Sub(int a, int b)
    {
        return a - b;
    }

    public int Div(int a, int b)
    {
        return a / b;
    }

    public int Mult(int a, int b)
    {
        return a * b;
    }
}

class Program
{
    static void Main(string[] args)
    {
        int sum = Test.SumOfSquares(new[] {1, 2, 3}, new IntArithmetic());
    }
}

public static class Test
{
    public static int SumOfSquares<T>(IEnumerable<T> sequence, IArithmeticOperations<T> summator)
    {
        // Do work
    }
}