委托的运用

下面这篇代码展示了委托的运用,非常精彩,代码版权归"@microsoft"所有.

 

  1None.gif//版权所有 (C) 2000 Microsoft Corporation。保留所有权利。
  2None.gif
  3None.gif// bookstore.cs
  4None.gifusing System;
  5None.gif
  6None.gif// 处理书店的一组类:
  7None.gifnamespace Bookstore 
  8ExpandedBlockStart.gifContractedBlock.gifdot.gif{
  9InBlock.gif   using System.Collections;
 10InBlock.gif
 11InBlock.gif   // 描述图书列表中的一本书:
 12InBlock.gif   public struct Book
 13ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
 14InBlock.gif      public string Title;        // 书的标题。
 15InBlock.gif      public string Author;       // 书的作者。
 16InBlock.gif      public decimal Price;       // 书的价格。
 17InBlock.gif      public bool Paperback;      // 该书是平装本吗?
 18InBlock.gif
 19InBlock.gif      public Book(string title, string author, decimal price, bool paperBack)
 20ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
 21InBlock.gif         Title = title;
 22InBlock.gif         Author = author;
 23InBlock.gif         Price = price;
 24InBlock.gif         Paperback = paperBack;
 25ExpandedSubBlockEnd.gif      }

 26ExpandedSubBlockEnd.gif   }

 27InBlock.gif
 28InBlock.gif   // 声明一个用来处理书的委托类型:
 29InBlock.gif   public delegate void ProcessBookDelegate(Book book);
 30InBlock.gif
 31InBlock.gif   // 维护一个图书数据库。
 32InBlock.gif   public class BookDB
 33ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
 34InBlock.gif      // 列出数据库中的所有图书:
 35InBlock.gif      ArrayList list = new ArrayList();   
 36InBlock.gif
 37InBlock.gif      // 向数据库中添加图书:
 38InBlock.gif      public void AddBook(string title, string author, decimal price, bool paperBack)
 39ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
 40InBlock.gif         list.Add(new Book(title, author, price, paperBack));
 41ExpandedSubBlockEnd.gif      }

 42InBlock.gif
 43InBlock.gif      // 对每一本平装图书上调用传入的委托来处理该图书: 
 44InBlock.gif      public void ProcessPaperbackBooks(ProcessBookDelegate processBook)
 45ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
 46InBlock.gif         foreach (Book b in list) 
 47ExpandedSubBlockStart.gifContractedSubBlock.gif         dot.gif{
 48InBlock.gif            if (b.Paperback)
 49InBlock.gif            // 正在调用委托:
 50InBlock.gif               processBook(b);
 51ExpandedSubBlockEnd.gif         }

 52ExpandedSubBlockEnd.gif      }

 53ExpandedSubBlockEnd.gif   }

 54ExpandedBlockEnd.gif}

 55None.gif
 56None.gif// 正在使用书店类:
 57None.gifnamespace BookTestClient
 58ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 59InBlock.gif   using Bookstore;
 60InBlock.gif
 61InBlock.gif   // 计算图书总价格和平均价格的类:
 62InBlock.gif   class PriceTotaller
 63ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
 64InBlock.gif      int countBooks = 0;
 65InBlock.gif      decimal priceBooks = 0.0m;
 66InBlock.gif
 67InBlock.gif      internal void AddBookToTotal(Book book)
 68ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
 69InBlock.gif         countBooks += 1;
 70InBlock.gif         priceBooks += book.Price;
 71ExpandedSubBlockEnd.gif      }

 72InBlock.gif
 73InBlock.gif      internal decimal AveragePrice()
 74ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
 75InBlock.gif         return priceBooks / countBooks;
 76ExpandedSubBlockEnd.gif      }

 77ExpandedSubBlockEnd.gif   }

 78InBlock.gif
 79InBlock.gif   // 测试图书数据库的类:
 80InBlock.gif   class Test
 81ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
 82InBlock.gif      // 打印书的标题。
 83InBlock.gif      static void PrintTitle(Book b)
 84ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
 85InBlock.gif         Console.WriteLine("   {0}", b.Title);
 86ExpandedSubBlockEnd.gif      }

 87InBlock.gif
 88InBlock.gif      // 在此处开始执行。
 89InBlock.gif      static void Main()
 90ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
 91InBlock.gif         BookDB bookDB = new BookDB();
 92InBlock.gif
 93InBlock.gif         // 用一些书初始化数据库:
 94InBlock.gif         AddBooks(bookDB);      
 95InBlock.gif
 96InBlock.gif         // 打印平装书的所有书名:
 97InBlock.gif         Console.WriteLine("Paperback Book Titles:");
 98InBlock.gif         // 创建与静态方法
 99InBlock.gif         // Test.PrintTitle 关联的新委托对象:
100InBlock.gif         bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));
101InBlock.gif
102InBlock.gif         // 获取平装书的平均价格,方法是使用
103InBlock.gif         // PriceTotaller 对象:
104InBlock.gif         PriceTotaller totaller = new PriceTotaller();
105InBlock.gif         // 创建一个与在对象 totaller 上的非静态方法
106InBlock.gif         // AddBookToTotal 关联的新委托对象:
107InBlock.gif         bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));
108InBlock.gif         Console.WriteLine("Average Paperback Book Price: ${0:#.##}",
109InBlock.gif            totaller.AveragePrice());
110ExpandedSubBlockEnd.gif      }

111InBlock.gif
112InBlock.gif      // 用一些测试图书初始化图书数据库:
113InBlock.gif      static void AddBooks(BookDB bookDB)
114ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
115InBlock.gif         bookDB.AddBook("The C Programming Language"
116InBlock.gif            "Brian W. Kernighan and Dennis M. Ritchie"19.95mtrue);
117InBlock.gif         bookDB.AddBook("The Unicode Standard 2.0"
118InBlock.gif            "The Unicode Consortium"39.95mtrue);
119InBlock.gif         bookDB.AddBook("The MS-DOS Encyclopedia"
120InBlock.gif            "Ray Duncan"129.95mfalse);
121InBlock.gif         bookDB.AddBook("Dogbert's Clues for the Clueless"
122InBlock.gif            "Scott Adams"12.00mtrue);
123ExpandedSubBlockEnd.gif      }

124ExpandedSubBlockEnd.gif   }

125ExpandedBlockEnd.gif}

126None.gif
输出
Paperback Book Titles:
   The C Programming Language
   The Unicode Standard 2.0
   Dogbert's Clues for the Clueless
Average Paperback Book Price: $23.97

转载于:https://www.cnblogs.com/mazhiyuan/articles/286261.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

visual studio enter键代码自动补全

将resharper插件中的设置内容改成这个就可以enter键自动补全了

虚拟内存相关原理

内存管理1.虚拟内存2.内存分段3.内存分页多级页表TLB1.虚拟内存 众所周知:单片机是没有操作系统的,所以单片机的CPU是直接操作内存的物理地址(physical address,PA) 在这种情况下,程序内存中是无法同时运行多个程序。例如第一个程序在10位置的位置存放立一个数值,…

Team Up!用Visual Studio 2005 Team System组织所有的装备 --作者:Chris Menage

[摘要]本文基于Visual Studio 2005 Team System CTP,为您介绍在软件开发周期中中的开发进程、团队支持、工作项跟踪、单元和装载测试及其他。 软件开发通常被认为是个很困难的过程。前人已经通过组织无数次地学习和编著大量的书籍来阐述如何改进开发应用程序的流程…

贪心算法(leetcode分类解题,C++代码详细注释)

贪心算法前言455.分发饼干135.分发糖果435.无重叠区间605.种花问题452.用最小数量的箭引爆气球763.划分字母区间122. 买卖股票的最佳时机 II376. 摆动序列53. 最大子序和前言 贪心算法或贪心思想采用贪心的策略,保证每次操作都是局部最优的,从而使最后得…

[转]2006年十二星座运程 目录

白羊座2006年运程 金牛座2006年运程 双子座2006年运程 巨蟹座2006年运程 狮子座2006年运程 处女座2006年运程 天秤座2006年运程 天蝎座2006年运程 射手座2006年运程 摩羯座2006年运程 水瓶座2006年运程 双鱼座2006年运程作者Blog:http://blog.csdn.net/cndg…

双指针法(leetcode分类解题,C++代码详细注释)

双指针法前言167.两数之和 II - 输入有序数组88.合并两个有序数组142. 环形链表 II633.平方数之和680. 验证回文字符串 Ⅱ27. 移除元素344. 反转字符串剑指 Offer 05. 替换空格151. 翻转字符串里的单词206.反转链表125. 验证回文串19. 删除链表的倒数第 N 个结点面试题 02.02. …

二分法(leetcode分类解题,C++代码详细注释)

二分法前言69. x 的平方根35. 搜索插入位置前言 二分查找也常被称为二分法或者折半查找,每次查找时通过将待查找区间分成两部分并只取一部分继续查找,将查找的复杂度大大减少。对于一个长度为 O(n) 的数组,二分查找的时间复杂度为 O(log n)。…

ArcGIS 10——地理数据库管理GIS数据

写本文的最初意向是当前正在进行的项目中有实现ESRI版本化数据管理的功能模块,碰到一些棘手的问题,几经周折还是决定系统学习ArcGIS10的帮助文档。(文章摘抄的比较多) 地理数据库是用于保存数据集集合的“容器”。首先了解一下Arc…

Ubuntu NFS搭建过程

简介 NFS:是Network FileSystem。最大的作用就是通过网络,让不同的机器、不同的作业系统、可以分享档案。通过将共享目录挂接到本地,就可以像操作本地目录一样去操作共享的目录。在共享中分为服务器和客户端,需要安装的程序也不一样,客户端通…