// 工具人类
namespace DownStair
{
delegate void DownStairDelegate(); // 定义了一个下楼委托
class ToolMan
{
public string Name { get; set; } // 声明工具人的名字属性
// public DownStairDelegate downStairDelegate = null; // 初始化委托downStair为空委托
// 解决方案
public event DownStairDelegate downStairDelegate = null;
public ToolMan(string name) // 构造函数获取工具人名字
{
Name = name;
}
public void DownStair() // 定义了一个方法:工具人下楼帮忙带东西
{
Console.WriteLine("工具人" + Name + "下楼了");
//downStair(); // error,未将对象引用设置到对象的实例
// 解决方案
if (downStairDelegate != null)
{
downStairDelegate(); // 定义event后,只能在ToolMan类的内部触发
}
}
}
}
// 懒人类
class Lazyman
{
public string Name { get; set; }
public Lazyman(string name)
{
Name = name;
}
public void TakeFood()
{
Console.WriteLine("给" + Name + "带盒饭");
}
public void TakePackage()
{
Console.WriteLine("给" + Name + "拿快递");
}
public void PrintFile()
{
Console.WriteLine("给" + Name + "打印文件");
}
}
// 调用运行
// 事件(event):
// 基于委托,是类或对象向其他类或对象通知发生的事情的一种特殊签名的委托,事件的声明
// 受限制的委托,只能施加 +=、-= 操作符,只允许add、remove方法操作
// 不允许直接赋值,只能在类的内部触发
// 类似订阅和发布
class Program
{
static void Main(string[] args)
{
// 工具人下楼问题
// 创建对象
ToolMan toolman = new ToolMan("大椿");
Lazyman lazyman1 = new Lazyman("张三");
Lazyman lazyman2 = new Lazyman("李四");
Lazyman lazyman3 = new Lazyman("王五");
toolman.DownStair();
// 工具人大椿下楼了
Console.WriteLine("========");
toolman.downStairDelegate += lazyman1.TakeFood;
toolman.downStairDelegate += lazyman1.TakePackage;
toolman.downStairDelegate += lazyman2.TakePackage;
toolman.downStairDelegate += lazyman3.PrintFile;
toolman.DownStair();
// 工具人大椿下楼了
// 给张三带盒饭
// 给张三拿快递
// 给李四拿快递
// 给王五打印文件
Console.WriteLine("========");
toolman.downStairDelegate -= lazyman1.TakePackage;
toolman.DownStair();
// 工具人大椿下楼了
// 给张三带盒饭
// 给李四拿快递
// 给王五打印文件
出现问题
//Console.WriteLine("========");
//toolman.downStairDelegate = lazyman1.TakeFood; // 直接赋值后其他对象全部消失
//toolman.DownStair();
工具人大椿下楼了
给张三带盒饭
//Console.WriteLine("========");
//toolman.downStairDelegate(); // 可直接调用downStairDelegate(),此时张三未下楼。
给张三带盒饭
// 解决办法:使用event事件
}
}