C#事件的理解应用
之前对C#的事件理解的不够透彻,总是感觉在实际应用上差一些火候。最近写character类的相关内容,有了一些理解,在这里分享一下。
&感觉大神没必要往下看了
下面开始正式内容:
比如说,角色掉血,要显示掉血的数字,使用技能要播放特效。最直接的方式是这样写:
public class Character
{
private float hp;
public void AddHp(float _deltaHp)
{
hp += _deltaHp;
CharacterEffect effect = new CharacterEffect();
effect.PlayAddHpEffect();
}
public void DoSkill()
{
CharacterEffect effect = new CharacterEffect();
effect.PlaySkillEffect();
}
}
public class CharacterEffect
{
public void PlayAddHpEffect()
{
//Do Effect
}
public void PlaySkillEffect()
{
//DO Effect
}
}
现在用事件来写,是这样的:
public class Character
{
public delegate void CharacterDelegate<T>(T values);
public CharacterDelegate<float> hpChangeEvent;
public CharacterDelegate<int> skillEvent;
private float hp;
public void AddHp(float _deltaHp)
{
hp += _deltaHp;
if (hpChangeEvent != null)
{
hpChangeEvent(hp);
}
}
public void DoSkill(int _id)
{
if (skillEvent != null)
{
skillEvent(_id);
}
}
}
public class CharacterEffect
{
private Character character;
public CharacterEffect(Character _target)
{
character = _target;
character.hpChangeEvent += PlayAddHpEffect;
character.skillEvent += PlaySkillEffect;
}
public void PlayAddHpEffect(float _hp)
{
//Do Effect
}
public void PlaySkillEffect(int _id)
{
//DO Effect
}
}
现在对比一下两种方法:
方法一,最粗暴的方式,不过不利于维护。比如,角色血量变化的效果需要改变,这时候就需要更改你所写的数据类。这样写也让你的类变得不纯粹,类中包含其他的和自己无关的东西。
方法二,用事件来做,好处就是将耦合的地方分离。让我的存储数据的类只做存储数据的事;后期更改效果也不用对我的数据类进行任何改动,利于维护。
C#事件的理解应用的更多相关文章
- QT中的线程与事件循环理解(1)
1.需要使用多线程管理的例子 一个进程可以有一个或更多线程同时运行.线程可以看做是“轻量级进程”,进程完全由操作系统管理,线程即可以由操作系统管理,也可以由应用程序管理.Qt 使用QThread 来管 ...
- jquery关于on click事件的理解
jquery关于on click事件的理解 <pre><a style="min-width:60px; margin-left:6px;" wenzhangid ...
- C# 事件的理解
说实话,事件弄得还是很晕,有待于以后的强化吧,下面是我对事件的一点理解 首先,参见大牛的帖子:网上大牛事件讲解 下面我来说一说事件的大致流程: 事件委托事件概述事件就是当对象或类状态发生改变时,对象或 ...
- 如何给循环中的对象添加事件--深入理解JavaScript的闭包特性
初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...
- Android事件分发理解
Android事件分发机制是个难点和重点,结合下各家,写点自己的理解.. 首先抛出一个小问题,写一个button的点击事件 button.setOnClickListener(new OnClickL ...
- C#基础学习之事件的理解和应用
事件的使用和委托类似,也是分四步来实现:声明委托.定义事件.注册事件.调用事件 我们先看一下事件的定义 //定义委托 public delegate void PublishEventHandler( ...
- WPF之路由事件的理解
博客园上讲解路由事件的文章很多,在此转其中之一供学习参考: https://www.cnblogs.com/zhili/p/WPFRouteEvent.html 网上流传的文章中都对冒泡进行了说明,但 ...
- 移动端的touch click事件的理解+点透
移动端在touch上一共有4个事件 touchstart touchmove touchend touchcancel, touchcancel, 一般来说,它们执行的顺序为 touchstart - ...
- js的事件流理解
面试问到js的事件流,当时说的不是很清楚,现在觉得有必要把这个弄清楚. 事件捕获和事件冒泡 事件流描述的是从页面中接收事件的顺序,也可理解为事件在页面中传播的顺序. 事件流主要分为两种,即事件捕获和事 ...
随机推荐
- IDF-CTF-牛刀小试-啥?
本人属于Web安全这一块的小白,稍微了作了一下知识补充就开始了CTF,其中的有很多不懂但看多了网上大牛的解题办法和思路.便开始有了一些要想动手记录的冲动,希望大家共同进步学习,本文能对读者有所帮助~ ...
- node-glob学习
node的glob模块允许你使用 *等符号, 来写一个glob规则,像在shell里一样,获取匹配对应规则的文件. 这个glob工具基于javascript.它使用了 minimatch 库来进行匹配 ...
- jQuery 中 jQuery(function(){})与(function(){})(jQuery) 的区别
$(document).ready(function(){ // 在这里写你的代码... }); 在DOM加载完成时运行的代码 可以简写成 jQuery(function(){ // 在这里写你的代码 ...
- 抓取百万知乎用户信息之HttpHelper的迭代之路
什么是Httphelper? httpelpers是一个封装好拿来获取网络上资源的工具类.因为是用http协议,故取名httphelper. httphelper出现的背景 使用WebClient可以 ...
- vtk多线程简单测试
vtkMultithreader is a class that provides support for multithreaded execution using sproc() on an SG ...
- c语言第一章第一节 认识变量
声明:本人大一新生,闲着无聊..写写c语言教程..菜鸟一枚..大神勿喷!!! 接下来我们都用dev来进行编译..vc++太古老了,没提示功能,不好上手,并且老是出毛病..vs太大了,编个c不至于,运行 ...
- acm的ubuntu (ubuntu16.04 安装指南,chrome安装,vim配置,git设置和github,装QQ)
日常手贱把ubuntu14.04更新到了16.04,然后就game over了.mdzz,不然泥萌也看不到这篇博客了=.= 然后花了些时间重装了一个16.04版的,原来那个14.04的用可以用,就是动 ...
- dubbo实践
最近公司准备重构内部服务模块,准备使用dubbo,故研究一下. 官方文档:http://alibaba.github.io/dubbo-doc-static/Home-zh.htm 1. 用maven ...
- PYTHON文件操作(二)
class file(object) def close(self): # real signature unknown; restored from __doc__ 关闭文件 "" ...
- 项目管理的一些Tip
最近带领了一个大概150人天的项目,做一些备注: 1, 知人善用. 排期分任务的时候,要先了解每个团队成员的特点,包括技术水平.性格,看他是适合做技术难度大的模块还是适合做业务逻辑复杂的模块. 2, ...