Jon*_*eet 73
是的,代表在很多方面都像单方法接口.然而:
最后一点是最重要的一点 - 考虑LINQ表达式:
var query = collection.Where(x => x > 5)
.Select(x => x * x);
Run Code Online (Sandbox Code Playgroud)
现在想象一下,如果表达的逻辑x > 5和x * x你不得不写每个表达式一个单独的类,并实现一个接口:克鲁夫特的VS有用的代码量将是可笑的.当然,语言本来可以设计为允许通过单独的类从lambda表达式转换为接口实现,但是你仍然失去了能够简单地编写一个单独的方法并创建一个委托作为目标的好处.你还会失去多人能力.
作为一个类似的思想练习,考虑循环语句,如while和for.我们真的需要它们goto吗?不.但生活要好得多与他们.代表们也是如此 - 实际上是属性,事件等.它们都使开发更简单.
das*_*ght 28
最大的实际区别是,您可以为同一个类的同一个委托提供不同的委托实例,而不能使用接口.
void delegate XYZ(int p);
interface IXyz {
void doit(int p);
}
class One {
// All four methods below can be used to implement the XYZ delegate
void XYZ1(int p) {...}
void XYZ2(int p) {...}
void XYZ3(int p) {...}
void XYZ4(int p) {...}
}
class Two : IXyz {
public void doit(int p) {
// Only this method could be used to call an implementation through an interface
}
}
Run Code Online (Sandbox Code Playgroud)
Lio*_*ion 17
委托和接口都允许类设计器分离类型声明和实现.给定的接口可以由任何类或结构继承和实现.可以为任何类的方法创建委托,只要该方法适合委托的方法签名即可.接口引用或委托可以由不了解实现接口或委托方法的类的对象使用.鉴于这些相似之处,类设计者何时应该使用委托,何时应该使用接口?
在以下情况下使用代理:
- 使用事件设计模式.
- 期望封装静态方法.
- 调用者无需访问实现该方法的对象上的其他属性,方法或接口.
- 需要容易的组合物.
- 一个类可能需要多个方法的实现.
在以下情况下使用接口:
- 可以调用一组相关方法.
- 一个类只需要该方法的一个实现.
- 使用该接口的类将要将该接口强制转换为其他接口或类类型.
- 正在实现的方法链接到类的类型或标识:例如,比较方法.
使用单方法接口而不是委托的一个很好的例子是
IComparable通用版本IComparable(Of T).IComparable声明CompareTo方法,该方法返回一个整数,该整数指定小于,等于或大于相同类型的两个对象之间的关系.IComparable可以用作排序算法的基础.虽然使用委托比较方法作为排序算法的基础是有效的,但它并不理想.由于比较能力属于类,比较算法在运行时不会改变,因此单方法接口是理想的.
代理和接口是C#中的两个不同概念,但它们具有共性.委托和接口都只包含声明.实现由不同的编程对象完成.