自定义事件:
这里主要模拟刷银行卡,手机提示刷卡信息的过程。
 
 
  1. 声明一个委托类型
public delegate void DelMethod(string bankName,decimal deposit,decimal amount);  //委托与类平级
 
 
  1. 创建一个银行卡类,刷卡的时候会触发通知事件
	public class BankCard
{
public string BankName { set; get; }
public decimal Balance { set; get; }
public BankCard(string bankName, decimal balance)
{
this.BankName = bankName;
this.Balance = balance;
}
public event DelMethod OnNotification;//事件和方法平级
public void BrushCard(decimal amount)
{
this.Balance-=amount;
if (OnNotification != null)
{
OnNotification(this.BankName, this.Balance, amount);
}
}
}
 
 
  1. 创建一个手机类,用于发送提示信息
    public class CellPhone
{
public void ShowShortMessage(string bankName, decimal balance,decimal amount)
{
Console.WriteLine("您{0}卡已经刷卡消费{1}元,目前余额为{2}元,如不是本人操作,请立即与本行联系。。", bankName, amount, balance);
}
}
 
 
  1. 调用
		static void Main(string[] args)
{
BankCard bankCard = new BankCard("中国银行",10000m); //创建一个银行卡
CellPhone iPhone = new CellPhone(); //创建一个手机
bankCard.OnNotification += new DelMethod(iPhone.ShowShortMessage); //订阅银行卡刷卡事件
bankCard.BrushCard(500); //刷卡
Console.ReadLine();
}
 
 

运行结果:

下面使用标准事件EventHandler事件,并且传参给回调函数。

  1. 声明一个银行卡类
public class BankCard
{
//为银行卡类创建一个泛型的事件
public event EventHandler<eventHandleArgs> Eventargs;
//事件触发方法,触发的时候传入一个银行名称
public void IssrueEvent(string bankName)
{
//创建自定义实例,因为这里需要将方法的参数赋值给对象的属性
eventHandleArgs args = new eventHandleArgs();
args._BankName = bankName;
if (Eventargs != null)
//触发事件,然后将自定义的对象作为事件触发类型传入
Eventargs(this, args);
}
}
 
 
  1. 创建手机类用于通知刷卡信息
 public class Phone
{
public void ShowMessage(object sender, EventArgs e)
{
//由于EventArgs类是eventHandleArgs类的父类,所以可以强转为子类对象
eventHandleArgs handle = (eventHandleArgs)e;
Console.WriteLine("您{0}卡出现了一笔消费,如果不是你本人操作请与本行联系!", handle._BankName);
}
}
 
 
  1. 自定义一个用于传递银行名称的类,继承自EventArgs类
  public class eventHandleArgs : EventArgs
{
public string _BankName;
}
 
 
  1. 调用
 static void Main(string[] args)
{
BankCard bankCard = new BankCard();
Phone iPhone = new Phone();
bankCard.Eventargs += new EventHandler<eventHandleArgs>(iPhone.ShowMessage);
bankCard.IssrueEvent("中国银行");
Console.ReadLine();
}
 
 
  1. 运行结果:

总结:有些人会说,直接调用方法不就可以了,干嘛还要订阅事件?
针对以上例子,我们设想一个场景。一旦有人刷卡一次,银行类就需要在源代码中增加手机提示方法,来100个人刷卡就需要增加100个刷卡提示方法,这样是不符合程序设计开闭原则的。
但是如果银行类向外发布一个通知,谁需要这个通知,谁就订阅它。一旦订阅者触发了这个通知,发布者就按照约定(回调传参),去通知这个订阅者,不订阅则不通知。
这样一来,程序只要拓展,而不是修改。

 

转自https://blog.csdn.net/qq_34699535/article/details/106535429?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5-106535429-blog-119963230.pc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5-106535429-blog-119963230.pc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=9

最新文章

  1. Servlet基础(二) Servlet的生命周期
  2. 说下查询动作 Pivot
  3. Android 学习笔记之使用多线程实现断点下载...
  4. 配置mysql5.5主从服务器(转)
  5. Java 的局部变量和成员变量
  6. [团队项目]----Math Calculator
  7. mybatis()
  8. 官网下载旧版本的Xcode
  9. layout_weight属性详解
  10. UVA11100- The Trip, 2007
  11. PHP基础语法思维导图
  12. 用C#开发一个 UWP BLUETOOTH BLE 扫描APP
  13. CCF系列之窗口(201403-2)
  14. kafka学习
  15. 「CodeChef Dec13 REALSET」 Petya and Sequence 循环卷积
  16. [LeetCode] Insert into a Binary Search Tree 二叉搜索树中插入结点
  17. ----Androd 系统开机显示白条提示 “there is internal problem with your device, Contact your manufacture ... ”
  18. Win10系列:JavaScript综合实例4
  19. web.net用户控件
  20. TStrings与Memo.Lines赋值的问题

热门文章

  1. 编译报错,提示:This dependency was not found:* vue-editor-bridge
  2. JAVA8 常见用法
  3. 五:spring boot
  4. postgresql序列基本操作
  5. dot &amp; pixel &amp; point
  6. LCD1602液晶屏(续)
  7. Educational Codeforces Round 138 (Rated for Div. 2) - D. Counting Arrays
  8. 【1】第一篇 Postman的初级使用之设置环境快速切换生成环境与测试环境
  9. C++用递归实现求解相关函数
  10. 回归分析 3.X 多元线性回归