根据这篇文章,它说:
在以下情况下使用委托:
- 一个类可能需要多个方法的实现。
在以下情况下使用接口:
- 一个类只需要方法的一个实现。
谁可以给我解释一下这个?
那是……奇怪而令人困惑。如果您只需要一个方法的实现......使用一个方法(也许是一个虚拟方法)。与接口一样,委托的部分意义在于您可以替换多个不同的实现。
如果我不得不总结:
委托类型非常像只公开一个方法的接口,委托实例非常像实现该接口的类的实例 - 只是具有很多编译器的性感,使其非常容易写,即
x => 2 * x
,并且不需要(有时)需要实例。
代表还有一些其他有用的技巧events
(多播等),但这听起来与文章的上下文无关。
一个类可能需要多个方法的实现。
public delegate int PerformCalculation(int x, int y);
void SomeMethod()
{
PerformCalculation PerformCalculation_1 = myDelegateFun_1;
PerformCalculation PerformCalculation_2 = myDelegateFun_2;
PerformCalculation_1(5, 3);
PerformCalculation_2(5, 3);
}
private int myDelegateFun_1(int x, int y)
{
return x + y;
}
private int myDelegateFun_2(int x, int y)
{
return x + y;
}
在上面的示例中,PerformCalculation_1、PerformCalculation_2 是 PerformCalculation 的多个实现
A class only needs one implementation of the method
interface IDimensions
{
float Length();
}
class Box : IDimensions
{
float Length()
{
return lengthInches;
}
}
在上面的示例中,只有接口公开的方法的单个实现。
在我的简单头脑中,这与 ICompare/IComparable 非常相似。
接口的实现意味着行为是实现类所固有的。行为不会根据呼叫者或呼叫的情况而改变。
代表说该操作不是类固有的,而是基于上下文或调用者来定义的。
这个措辞似乎有点混乱,但可以用一个例子来说明。假设有人正在设计一个希望在单击时提供通知的按钮控件。通常的做法是让按钮维护要呼叫的代表列表。如果一个类希望按钮在其自身实例上调用其方法之一,它可以轻松构造一个委托,该委托将在该实例上调用该方法。请注意,为此目的使用委托意味着除了委托应该调用其方法的实例之外,还需要为委托构造一个堆对象。
另一种方法是定义一个接口INotifyOfButtonClick
,一个方法NotifyOfButtonClick()
,并让按钮控件保持一个列表INotifyButtonClick
。单击按钮时,它将调用NotifyOfButtonClick()
每个实例。如果表单只有一个使用该接口的按钮,或者如果所有此类按钮使用相同的方法,则表单可以实现INotifyOfButtonClick()
自己,并将自己添加到按钮的订阅列表中,而不必创建单独的委托来调用它的方法。在这种方法有效的场景中,它可能比使用委托更有效。但是,如果一个表单有两个使用相同界面的按钮,但想要调用不同的方法,那么事情就会变得更加复杂。在这种情况下,表单有必要创建一个新对象,其目的是实现INotifyOfButtonClick()
通过在它持有引用的表单上调用某个方法。使用这样的包装器对象可能会产生与委托相当的性能,但如果没有一些编译器帮助,委托就会有。
顺便说一句,如果微软可以为每个委托添加一个嵌套接口IInvoke
(例如Action<int>
定义一个 interface Action<int>.IInvoke
),那么如果接受 an 的方法Action<int>
被重写为接受 an Action<int>.IInvoke
,那么只有一个方法的对象将被此类委托调用可以简单地将自己传递给这样的方法。这样的功能可以提高闭包的效率。
• 接口只定义了一个方法。• 需要多播能力。• 订阅者需要多次实现接口。