解析Lua中实现类似C#事件机制学习教程

移动开发 iOS
Lua中实现类似C#事件机制学习教程是本文要介绍的内容,主要是来学习事件在lua中的使用,具体内容来看详细讲解。

Lua中实现类似C#事件机制学习教程是本文要介绍的内容,主要是来学习事件lua中的使用,具体内容来看详细讲解。Lua的语法非常灵活, 使用他的metatable及metamethod可以模拟出很多语言的特性.

C#中我们这样使用事件:

  1. xxx.Click += new System.EventHandler(xxx_Click);  
  2.  
  3. private void xxx_Click(object sender, EventArgs e)  
  4. {  
  5.     /**/  

在Lua中要达到同样的效果, 并且支持事件多播机制, 其关键在于重写metamethod __call, 从而使得不光function才能被调用, table也能够被调用.

主要思想就是, 通过一个table来保存注册事件的若干响应函数, 然后拿table当function一样来调用, 重写__call后, 实现调用table时遍历执行table中的注册方法.

需要在lua5.0 或 lua.net上执行, lua 5.1略有改动.

  1. test.lua  
  2. do 

事件原型对象, 所有事件由此原型生成

  1. Event = {}  
  2.  
  3. function Event:New()  
  4.     local event = {}  
  5.     setmetatable(event, self)  
  6.     --覆盖__index逻辑  
  7.     selfself.__index = self  
  8.     --覆盖__call逻辑  
  9.     selfself.__call = self.Call  
  10.     return event  
  11. end 

事件注册, 通过此方法将响应方法注册到事件上.

@source:响应方法的所属对象

@func:响应方法

  1. function Event:Add(source, func)  
  2.     table.insert(self, {source, func})      
  3. end 

内部方法, 重写了默认__call逻辑, 当event被触发调用时, 循环执行event中注册的响应方法

@table:对象产生调用时将本身传入

@:调用参数

  1. function Event.Call(table, )      
  2.     for _, item in ipairs(table) do  
  3.         --item[1]就是source, item[2]就是func响应方法  
  4.         --lua 5.1中无需使用unpack(arg), 直接使用即可  
  5.         item[2](item[1], unpack(arg))  
  6.     end  
  7. end 

以下为测试用例

创建一个window对象, 注册按钮的点击事件

  1. Window = {  
  2.     Name = "Simonw's Window",      
  3. }  
  4. function Window:Init() 

注册事件, self即Window, 对象来源.

  1. Button.ClickEvent:Add(self, self.Button_OnClick)      
  2.  

响应事件方法, sender即是传来的Button对象

  1. function Window:Button_OnClick(sender)      
  2.     print(sender.Name.." Click On "..self.Name)  
  3. end 

创建一个button对象, 拥有ClickEvent这样的事件

  1. Button = {  
  2.     Name = "A Button",  
  3.     --创建事件  
  4.     ClickEvent = Event:New(),  

执行点击按钮的动作

  1. function Button:Click()  
  2.     print('Click begin')  
  3.     --触发事件, self即sender参数  
  4.     self.ClickEvent(self)  
  5.     print('Click end')  
  6. end 

从这里执行

  1. Window:Init()  
  2. Button:Click()  
  3. --[[ 

执行结果:

  1. > dofile 'test.lua'  
  2. Click begin  
  3. A Button Click On Simonw's Window  
  4. Click end  
  5. ]]  
  6.  
  7. end 

小结:解析Lua中实现类似C#事件机制学习教程的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: CSDN博客
相关推荐

2009-08-31 18:01:41

C#接口事件

2011-06-30 10:28:50

C#开发

2011-08-24 13:27:07

Lua 游戏C接口脚本

2011-08-23 16:59:16

C++LUA脚本LUA API

2011-08-23 16:48:41

Lua 5.1API 函数

2011-08-24 15:22:09

2011-08-22 17:25:31

LuaC++函数

2009-09-02 18:34:28

C#鼠标事件

2011-08-25 16:38:06

EditPluslua

2009-08-27 16:53:01

C#委托C#事件

2009-09-03 16:38:49

C#回车键事件

2009-09-02 14:00:34

C#文件处理

2010-08-06 10:03:42

Flex事件

2009-09-09 11:29:32

C# TextBox事

2011-08-23 14:33:51

Lua捕获字符串

2011-08-23 17:33:08

LuaMetatable

2011-08-23 16:37:05

Lua数学库

2009-09-09 13:18:10

C# TextBox滚C# TextBox

2011-08-31 15:41:38

Lua解释器

2009-09-09 12:55:59

C# TextBox事
点赞
收藏

51CTO技术栈公众号