解析Lua中實現(xiàn)類似C#事件機制學(xué)習(xí)教程
Lua中實現(xiàn)類似C#事件機制學(xué)習(xí)教程是本文要介紹的內(nèi)容,主要是來學(xué)習(xí)事件在lua中的使用,具體內(nèi)容來看詳細講解。Lua的語法非常靈活, 使用他的metatable及metamethod可以模擬出很多語言的特性.
C#中我們這樣使用事件:
- xxx.Click += new System.EventHandler(xxx_Click);
- private void xxx_Click(object sender, EventArgs e)
- {
- /**/
- }
在Lua中要達到同樣的效果, 并且支持事件多播機制, 其關(guān)鍵在于重寫metamethod __call, 從而使得不光function才能被調(diào)用, table也能夠被調(diào)用.
主要思想就是, 通過一個table來保存注冊事件的若干響應(yīng)函數(shù), 然后拿table當(dāng)function一樣來調(diào)用, 重寫__call后, 實現(xiàn)調(diào)用table時遍歷執(zhí)行table中的注冊方法.
需要在lua5.0 或 lua.net上執(zhí)行, lua 5.1略有改動.
- test.lua
- do
事件原型對象, 所有事件由此原型生成
- Event = {}
- function Event:New()
- local event = {}
- setmetatable(event, self)
- --覆蓋__index邏輯
- selfself.__index = self
- --覆蓋__call邏輯
- selfself.__call = self.Call
- return event
- end
事件注冊, 通過此方法將響應(yīng)方法注冊到事件上.
@source:響應(yīng)方法的所屬對象
@func:響應(yīng)方法
- function Event:Add(source, func)
- table.insert(self, {source, func})
- end
內(nèi)部方法, 重寫了默認(rèn)__call邏輯, 當(dāng)event被觸發(fā)調(diào)用時, 循環(huán)執(zhí)行event中注冊的響應(yīng)方法
@table:對象產(chǎn)生調(diào)用時將本身傳入
@:調(diào)用參數(shù)
- function Event.Call(table, )
- for _, item in ipairs(table) do
- --item[1]就是source, item[2]就是func響應(yīng)方法
- --lua 5.1中無需使用unpack(arg), 直接使用即可
- item[2](item[1], unpack(arg))
- end
- end
以下為測試用例
創(chuàng)建一個window對象, 注冊按鈕的點擊事件
- Window = {
- Name = "Simonw's Window",
- }
- function Window:Init()
注冊事件, self即Window, 對象來源.
- Button.ClickEvent:Add(self, self.Button_OnClick)
響應(yīng)事件方法, sender即是傳來的Button對象
- function Window:Button_OnClick(sender)
- print(sender.Name.." Click On "..self.Name)
- end
創(chuàng)建一個button對象, 擁有ClickEvent這樣的事件
- Button = {
- Name = "A Button",
- --創(chuàng)建事件
- ClickEvent = Event:New(),
- }
執(zhí)行點擊按鈕的動作
- function Button:Click()
- print('Click begin')
- --觸發(fā)事件, self即sender參數(shù)
- self.ClickEvent(self)
- print('Click end')
- end
從這里執(zhí)行
- Window:Init()
- Button:Click()
- --[[
執(zhí)行結(jié)果:
- > dofile 'test.lua'
- Click begin
- A Button Click On Simonw's Window
- Click end
- ]]
- end
小結(jié):解析Lua中實現(xiàn)類似C#事件機制學(xué)習(xí)教程的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對你有所幫助!