C#事件的订阅相当于把所有订阅这个事件的函数都加入到一个函数列表里面去了
C#事件的取消订阅相当于把这个函数从事件对应的函数列表移除出去
当事件的实例执行的时候会遍历函数列表依次执行所有函数(有点类似 但注册两次 不会执行两次 应该是注册的时候会判断函数列表里面有没有这个函数
如果有就不多次注册了 )
如果想做热更新就要用Lua
lua里面是没有事件这个概念的 但如果知道C#的原理可以自己实现一下C#的事件 下面是代码
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], ...)
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 = {
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()
--写lua的时候很需要注意的一点是 函数的调用一定要在函数声明之后
如果是这样子写 代码会报错因为函数还没声明 这也是和C#不同的一些语言特性
async_test:Init()
function async_test:Init()
--注册事件, self即Window, 对象来源.
Button.ClickEvent:Add(self,self.Button_OnClick)
end