我希望你是我独家记忆

一段永远封存的记忆,随风而去
posts - 263, comments - 31, trackbacks - 0, articles - 3
   :: 首页 :: 新随笔 ::  :: 聚合  :: 管理

委托实例

Posted on 2009-07-30 14:09 Hero 阅读(182) 评论(0)  编辑 收藏 引用 所属分类: C#积累
  1 // bookstore.cs
  2 using System;
  3 
  4 // 用于处理书店的一组类:
  5 namespace Bookstore 
  6 {
  7    using System.Collections;
  8 
  9    // 描述图书列表中的一本书:
 10    public struct Book
 11    {
 12       public string Title;        // 书名。
 13       public string Author;       // 作者。
 14       public decimal Price;       // 价格。
 15       public bool Paperback;      // 是平装本吗?
 16 
 17       public Book(string title, string author, decimal price, bool paperBack)
 18       {
 19          Title = title;
 20          Author = author;
 21          Price = price;
 22          Paperback = paperBack;
 23       }
 24    }
 25 
 26    // 声明一个用于处理书的委托类型:
 27    public delegate void ProcessBookDelegate(Book book);
 28 
 29    // 维护一个图书数据库。
 30    public class BookDB
 31    {
 32       // 列出数据库中的所有图书:
 33       ArrayList list = new ArrayList();   
 34 
 35       // 向数据库中添加图书:
 36       public void AddBook(string title, string author, decimal price, bool paperBack)
 37       {
 38          list.Add(new Book(title, author, price, paperBack));
 39       }
 40 
 41       // 对每本平装图书调用传入委托来进行处理: 
 42       public void ProcessPaperbackBooks(ProcessBookDelegate processBook)
 43       {
 44          foreach (Book b in list) 
 45          {
 46             if (b.Paperback)
 47             // 调用该委托:
 48                processBook(b);
 49          }
 50       }
 51    }
 52 }
 53 
 54 // 使用 Bookstore 类:
 55 namespace BookTestClient
 56 {
 57    using Bookstore;
 58 
 59    // 计算图书总价格和平均价格的类:
 60    class PriceTotaller
 61    {
 62       int countBooks = 0;
 63       decimal priceBooks = 0.0m;
 64 
 65       internal void AddBookToTotal(Book book)
 66       {
 67          countBooks += 1;
 68          priceBooks += book.Price;
 69       }
 70 
 71       internal decimal AveragePrice()
 72       {
 73          return priceBooks / countBooks;
 74       }
 75    }
 76 
 77    // 测试图书数据库的类:
 78    class Test
 79    {
 80       // 打印书名。
 81       static void PrintTitle(Book b)
 82       {
 83          Console.WriteLine("   {0}", b.Title);
 84       }
 85 
 86       // 下面开始执行。
 87       static void Main()
 88       {
 89          BookDB bookDB = new BookDB();
 90 
 91          // 用一些书初始化数据库:
 92          AddBooks(bookDB);      
 93 
 94          // 打印所有平装本的书名:
 95          Console.WriteLine("Paperback Book Titles:");
 96          // 创建一个与静态方法 Test.PrintTitle 关联的
 97          // 新委托对象:
 98          bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));
 99 
100          // 使用 PriceTotaller 对象
101          // 获取平装本的平均价格:
102          PriceTotaller totaller = new PriceTotaller();
103          // 创建一个与对象 totaller 的非静态方法
104          // AddBookToTotal 关联的新委托对象:
105          bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));
106          Console.WriteLine("Average Paperback Book Price: ${0:#.##}",
107             totaller.AveragePrice());
108       }
109 
110       // 用一些测试图书初始化图书数据库:
111       static void AddBooks(BookDB bookDB)
112       {
113          bookDB.AddBook("The C Programming Language"
114             "Brian W. Kernighan and Dennis M. Ritchie"19.95mtrue);
115          bookDB.AddBook("The Unicode Standard 2.0"
116             "The Unicode Consortium"39.95mtrue);
117          bookDB.AddBook("The MS-DOS Encyclopedia"
118             "Ray Duncan"129.95mfalse);
119          bookDB.AddBook("Dogbert's Clues for the Clueless"
120             "Scott Adams"12.00mtrue);
121       }
122    }
123 }
124 
125 

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理