微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Lua中实现类似C#的事件机制

do --事件原型对象,所有事件由此原型生成 Event = {} function Event:New()     local event = {}     setMetatable(event,self)     --覆盖__index逻辑     self.__index = self     --覆盖__call逻辑     self.__call = self.Call     return event end --事件注册,通过此方法将响应方法注册到事件上. --@source:响应方法的所属对象 --@func:响应方法 function Event:Add(source,func)     table.insert(self,{source,func}) end --内部方法,重写了认__call逻辑,当event被触发调用时,循环执行event中注册的响应方法 --@table:对象产生调用时将本身传入 --@:调用参数 function Event:Call(table,...)     for _,item in ipairs(table) do         --item[1]就是source,item[2]就是func响应方法         --lua 5.1中无需使用unpack(arg),直接使用...即可         item[2](item[1],unpack(arg))     end end ------------------以下为测试用例----------------------- --创建一个window对象,注册按钮的点击事件 Window = {     Name = "Simonw's Window",} function Window:Init()     --注册事件,self即Window,对象来源.     Button.ClickEvent:Add(self,self.Button_OnClick) end --响应事件方法,sender即是传来的Button对象 function Window:Button_OnClick(sender)     print(sender.Name.." Click On "..self.Name) end --创建一个button对象,拥有ClickEvent这样的事件 Button = {     Name = "A Button",    --创建事件     ClickEvent = Event:New(),} --执行点击按钮的动作 function Button:Click()     print('Click begin')     --触发事件,self即sender参数     self.ClickEvent(self)     print('Click end') end --从这里执行 Window:Init() Button:Click() --[[ 执行结果: > dofile 'test.lua' Click begin A Button Click On Simonw's Window Click end ]] end

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐