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] 举报,一经查实,本站将立刻删除。