委托的运用

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

 

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

 26   }

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

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

 52      }

 53   }

 54}

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

 72
 73      internal decimal AveragePrice()
 74      {
 75         return priceBooks / countBooks;
 76      }

 77   }

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

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

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

124   }

125}

126
输出
Paperback Book Titles:
   The C Programming Language
   The Unicode Standard 2.0
   Dogbert's Clues for the Clueless
Average Paperback Book Price: $23.97
posted @ 2005-11-28 17:06    阅读(289)  评论(0编辑  收藏  举报