我读到你可以使用接口和委托来达到同样的目的。比如,您可以使用委托代替接口。
有人能提供一个例子吗?我在简言之书中看到了一个例子,但我没记错,想要离开。
是否可以提供一些示例代码?用例?
感谢。
答案 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));
}
您可以看到委托版本略小。
如果将它与内置的.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
}
}