从零开始搭xlua框架(一) C# 事件的原理 已经在如何在lua里面实现事件

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















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值