一个.NET委托的故事:彼得,老板和宇宙(1)

本文通过彼得的故事,解释了.NET委托的概念,从紧密耦合的单向依赖关系,到通过接口实现的多向依赖,展示了如何通过委托实现方法的分离和复用,最终达到更灵活的系统设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对.NET委托理解吗?无论你是否理解.NET委托,了解的程度如何,都看看下面这个故事吧。

紧耦合

从前,在南方一块奇异的土地上,有个工人名叫彼得,他非常勤奋,对他的老板总是百依百顺。但是他的老板是个吝啬的人,从不信任别人,坚决要求随时知道彼得的工作进度,以防止他偷懒。但是彼得又不想让老板呆在他的办公室里站在背后盯着他,于是就对老板做出承诺:无论何时,只要我的工作取得了一点进展我都会及时让你知道。彼得通过周期性地使用“带类型的引用”(原文为:“typed reference” 也就是delegate??)“回调”他的老板来实现他的承诺,如下:

  1. class Worker {   
  2. public void Advise(Boss boss) { _boss = boss; }   
  3. public void DoWork() {   
  4. Console.WriteLine(“工作: 工作开始”);   
  5. if( _boss != null ) _boss.WorkStarted();   
  6.  
  7. Console.WriteLine(“工作: 工作进行中”);   
  8. if( _boss != null ) _boss.WorkProgressing();   
  9.  
  10. Console.WriteLine("“工作: 工作完成”");   
  11. if( _boss != null ) {   
  12. int grade = _boss.WorkCompleted();   
  13. Console.WriteLine(“工人的工作得分=” + grade);   
  14. }   
  15. }   
  16. private Boss _boss;   
  17. }   
  18.  
  19. class Boss {   
  20. public void WorkStarted() { }   
  21. public void WorkProgressing() { }   
  22. public int WorkCompleted() {   
  23. Console.WriteLine(“时间差不多1);   
  24. return 2;   
  25. }   
  26. }   
  27.  
  28. class Universe {   
  29. static void Main() {   
  30. Worker peter = new Worker();   
  31. Boss boss = new Boss();   
  32. peter.Advise(boss);   
  33. peter.DoWork();   
  34.  
  35. Console.WriteLine(“Main: 工人工作完成”);   
  36. Console.ReadLine();   
  37. }   
  38. }   

接口

现在,彼得成了一个特殊的人,他不但能容忍吝啬的老板,而且和他周围的宇宙也有了密切的联系,以至于他认为宇宙对他的工作进度也感兴趣。不幸的是,他必须也给宇宙添加一个特殊的回调函数Advise来实现同时向他老板和宇宙报告工作进度。彼得想要把潜在的通知的列表和这些通知的实现方法分离开来,于是他决定把方法分离为一个接口(这些接口又会造成其他的问题,将由.NET委托来解决):

  1. interface IWorkerEvents {   
  2. void WorkStarted();   
  3. void WorkProgressing();   
  4. int WorkCompleted();   
  5. }   
  6.  
  7. class Worker {   
  8. public void Advise(IWorkerEvents events) { _events = events; }   
  9. public void DoWork() {   
  10. Console.WriteLine(“工作: 工作开始”);   
  11. if( _events != null ) _events.WorkStarted();   
  12.  
  13. Console.WriteLine(“工作: 工作进行中”);   
  14. if(_events != null ) _events.WorkProgressing();   
  15.  
  16. Console.WriteLine("“工作: 工作完成”");   
  17. if(_events != null ) {   
  18. int grade = _events.WorkCompleted();   
  19.  
  20. Console.WriteLine(“工人的工作得分=” + grade);   
  21. }   
  22. }   
  23. private IWorkerEvents _events;   
  24. }   
  25.  
  26. class Boss : IWorkerEvents {   
  27. public void WorkStarted() { }   
  28. public void WorkProgressing() { }   
  29. public int WorkCompleted() {   
  30. Console.WriteLine(“时间差不多1);   
  31. return 3;   
  32. }   
  33. }   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值