我希望在 VB.NET 或 C# 或其他一些一流的 .NET 语言中实现观察者模式。我听说委托(delegate)可以用于此目的,但不明白为什么它们比观察者上实现的普通旧接口(interface)更受青睐。所以,
- 为什么我应该使用委托(delegate)而不是定义自己的接口(interface)并传递对实现它们的对象的引用?
- 为什么我想避免使用委托(delegate),而采用良好的老式界面?
最佳答案
当您可以直接调用方法时,您不需要委托(delegate)。
当调用方法的代码不知道/关心它调用的方法是什么时,委托(delegate)非常有用 - 例如,您可能调用一个长时间运行的任务并向其传递一个委托(delegate)任务可用于发送有关其状态的通知的回调方法。
这是一个(非常愚蠢的)代码示例:
enum TaskStatus
{
Started,
StillProcessing,
Finished
}
delegate void CallbackDelegate(Task t, TaskStatus status);
class Task
{
public void Start(CallbackDelegate callback)
{
callback(this, TaskStatus.Started);
// calculate PI to 1 billion digits
for (...)
{
callback(this, TaskStatus.StillProcessing);
}
callback(this, TaskStatus.Finished);
}
}
class Program
{
static void Main(string[] args)
{
Task t = new Task();
t.Start(new CallbackDelegate(MyCallbackMethod));
}
static void MyCallbackMethod(Task t, TaskStatus status)
{
Console.WriteLine("The task status is {0}", status);
}
}
正如您所看到的,Task
类不知道也不关心——在本例中——委托(delegate)是一个将任务状态打印到控制台的方法。该方法同样可以通过网络连接将状态发送到另一台计算机。等等
关于.net - 使用委托(delegate)的优点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/302819/