📄 mailmanager.cs
字号:
//*****************************************************
// Microsoft .NET框架程序设计(修订版)配书源代码
// 第11章,第229-236页
//*****************************************************
using System;
class MailManager
{
// 在MailManager内部定义MailMsgEventArgs类型
public class MailMsgEventArgs : EventArgs
{
// 1. 传递给事件接受者的类型定义信息
public MailMsgEventArgs(
String from, String to, String subject, String body)
{
this.from = from;
this.to = to;
this.subject = subject;
this.body = body;
}
public readonly String from, to, subject, body;
}
// 2. 下面的委托类型定义了接受者必须实现的回调方法原型
public delegate void MailMsgEventHandler(
Object sender, MailMsgEventArgs args);
// 3. 事件成员
public event MailMsgEventHandler MailMsg;
// 4. 下面的受保护虚方法负责通知事件的登记对象
protected virtual void OnMailMsg(MailMsgEventArgs e)
{
// 有对象登记事件吗?
if (MailMsg != null)
{
// 如果有,则通知委托链表上的所有对象
MailMsg(this, e);
}
}
// 5. 下面的方法将输入转化为期望的事件,该
// 方法在新的电子邮件消息到达时被调用
public void SimulateArrivingMsg(String from, String to,
String subject, String body)
{
// 构造一个对象保存希望传递给通知接受者的信息
MailMsgEventArgs e =
new MailMsgEventArgs(from, to, subject, body);
// 调用虚方法通知对象事件已发生,
// 如果派生类型没有重写该虚方法,
// 对象将通知所有登记的事件侦听者
OnMailMsg(e);
}
}
class Fax
{
// 将 MailManager 对象传递给构造器
public Fax(MailManager mm)
{
// 构造一个指向FaxMsg回调方法的MailMsgEventHandler
// 委托实例。然后登记MailManager的 MailMsg 事件
mm.MailMsg += new MailManager.MailMsgEventHandler(FaxMsg);
}
// MailManager 将调用该方法来通知
// Fax对象收到一个新的电子邮件消息
private void FaxMsg(
Object sender, MailManager.MailMsgEventArgs e)
{
// 参数 ‘sender’ 表示 MailManager 对象,如果
// 期望和事件的触发者通信,将会用到该参数
// 参数 ‘e’ 表示MailManager对象希望提供的一些
// 附加事件信息
// 通常情况下,这里的代码应该传真电子邮件消息,
// 这里的实现仅仅将消息显示到控制台上
Console.WriteLine("Faxing mail message:");
Console.WriteLine(
" From: {0}\n To: {1}\n Subject: {2}\n Body: {3}\n",
e.from, e.to, e.subject, e.body);
}
public void Unregister(MailManager mm)
{
// 构造一个指向FaxMsg回调方法的MailMsgEventHandler
// 委托实例
MailManager.MailMsgEventHandler callback =
new MailManager.MailMsgEventHandler(FaxMsg);
// 注销MailManager的 MailMsg 事件
mm.MailMsg -= callback;
}
}
class Pager
{
// 将 MailManager 对象传递给构造器
public Pager(MailManager mm)
{
// 构造一个指向SendMsgToPager回调方法的MailMsgEventHandler
// 委托实例。然后登记MailManager的 MailMsg 事件
mm.MailMsg +=
new MailManager.MailMsgEventHandler(SendMsgToPager);
}
// MailManager 将调用该方法来通知
// Pager对象收到一个新的电子邮件消息
private void SendMsgToPager(
Object sender, MailManager.MailMsgEventArgs e)
{
// 参数 ‘sender’ 表示 MailManager 对象,如果
// 期望和事件的触发者通信,将会用到该参数
// 参数 ‘e’ 表示MailManager对象希望提供的一些
// 附加事件信息
// 通常情况下,这里的代码应该传真电子邮件消息,
// 这里的实现仅仅将消息显示到控制台上
Console.WriteLine("Sending mail message to pager:");
Console.WriteLine(
" From: {0}\n To: {1}\n Subject: {2}\n Body: {3}\n",
e.from, e.to, e.subject, e.body);
}
}
class App
{
static void Main()
{
// 构造一个 MailManager 对象
MailManager mm = new MailManager();
// 构造一个 Fax 对象,构造器参数为上面的 MailManager 对象
Fax fax = new Fax(mm);
// 构造一个 Pager 对象, 构造器参数为上面的 MailManager 对象
Pager pager = new Pager(mm);
// 模拟一个进来的邮件消息
mm.SimulateArrivingMsg("Jeffrey Richter",
"Santa",
"Christmas",
"Thanks for the great presents last year");
// 强制 Fax 对象注销 MailManager 对象
fax.Unregister(mm);
// 模拟一个进来的邮件消息
mm.SimulateArrivingMsg("Jeffrey Richter", "Mom & Dad",
"My birthday",
"Thanks for the great presents last year");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -