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

3
 // bookstore.cs
// bookstore.cs4
 using System;
using System;5

6
 // 处理书店的一组类:
// 处理书店的一组类:7
 namespace Bookstore
namespace Bookstore 8
 {
{9
 using System.Collections;
   using System.Collections;10

11
 // 描述图书列表中的一本书:
   // 描述图书列表中的一本书:12
 public struct Book
   public struct Book13
 {
   {14
 public string Title;        // 书的标题。
      public string Title;        // 书的标题。15
 public string Author;       // 书的作者。
      public string Author;       // 书的作者。16
 public decimal Price;       // 书的价格。
      public decimal Price;       // 书的价格。17
 public bool Paperback;      // 该书是平装本吗?
      public bool Paperback;      // 该书是平装本吗?18

19
 public Book(string title, string author, decimal price, bool paperBack)
      public Book(string title, string author, decimal price, bool paperBack)20
 {
      {21
 Title = title;
         Title = title;22
 Author = author;
         Author = author;23
 Price = price;
         Price = price;24
 Paperback = paperBack;
         Paperback = paperBack;25
 }
      }26
 }
   }27

28
 // 声明一个用来处理书的委托类型:
   // 声明一个用来处理书的委托类型:29
 public delegate void ProcessBookDelegate(Book book);
   public delegate void ProcessBookDelegate(Book book);30

31
 // 维护一个图书数据库。
   // 维护一个图书数据库。32
 public class BookDB
   public class BookDB33
 {
   {34
 // 列出数据库中的所有图书:
      // 列出数据库中的所有图书:35
 ArrayList list = new ArrayList();
      ArrayList list = new ArrayList();   36

37
 // 向数据库中添加图书:
      // 向数据库中添加图书:38
 public void AddBook(string title, string author, decimal price, bool paperBack)
      public void AddBook(string title, string author, decimal price, bool paperBack)39
 {
      {40
 list.Add(new Book(title, author, price, paperBack));
         list.Add(new Book(title, author, price, paperBack));41
 }
      }42

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

56
 // 正在使用书店类:
// 正在使用书店类:57
 namespace BookTestClient
namespace BookTestClient58
 {
{59
 using Bookstore;
   using Bookstore;60

61
 // 计算图书总价格和平均价格的类:
   // 计算图书总价格和平均价格的类:62
 class PriceTotaller
   class PriceTotaller63
 {
   {64
 int countBooks = 0;
      int countBooks = 0;65
 decimal priceBooks = 0.0m;
      decimal priceBooks = 0.0m;66

67
 internal void AddBookToTotal(Book book)
      internal void AddBookToTotal(Book book)68
 {
      {69
 countBooks += 1;
         countBooks += 1;70
 priceBooks += book.Price;
         priceBooks += book.Price;71
 }
      }72

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

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

88
 // 在此处开始执行。
      // 在此处开始执行。89
 static void Main()
      static void Main()90
 {
      {91
 BookDB bookDB = new BookDB();
         BookDB bookDB = new BookDB();92

93
 // 用一些书初始化数据库:
         // 用一些书初始化数据库:94
 AddBooks(bookDB);
         AddBooks(bookDB);      95

96
 // 打印平装书的所有书名:
         // 打印平装书的所有书名:97
 Console.WriteLine("Paperback Book Titles:");
         Console.WriteLine("Paperback Book Titles:");98
 // 创建与静态方法
         // 创建与静态方法99
 // Test.PrintTitle 关联的新委托对象:
         // Test.PrintTitle 关联的新委托对象:100
 bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));
         bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));101

102
 // 获取平装书的平均价格,方法是使用
         // 获取平装书的平均价格,方法是使用103
 // PriceTotaller 对象:
         // PriceTotaller 对象:104
 PriceTotaller totaller = new PriceTotaller();
         PriceTotaller totaller = new PriceTotaller();105
 // 创建一个与在对象 totaller 上的非静态方法
         // 创建一个与在对象 totaller 上的非静态方法106
 // AddBookToTotal 关联的新委托对象:
         // AddBookToTotal 关联的新委托对象:107
 bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));
         bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));108
 Console.WriteLine("Average Paperback Book Price: ${0:#.##}",
         Console.WriteLine("Average Paperback Book Price: ${0:#.##}",109
 totaller.AveragePrice());
            totaller.AveragePrice());110
 }
      }111

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


 
    
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号