成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

解析Lua中實現類似C#事件機制學習教程

移動開發 iOS
Lua中實現類似C#事件機制學習教程是本文要介紹的內容,主要是來學習事件在lua中的使用,具體內容來看詳細講解。

Lua中實現類似C#事件機制學習教程是本文要介紹的內容,主要是來學習事件lua中的使用,具體內容來看詳細講解。Lua的語法非常靈活, 使用他的metatable及metamethod可以模擬出很多語言的特性.

C#中我們這樣使用事件:

  1. xxx.Click += new System.EventHandler(xxx_Click);  
  2.  
  3. private void xxx_Click(object sender, EventArgs e)  
  4. {  
  5.     /**/  

在Lua中要達到同樣的效果, 并且支持事件多播機制, 其關鍵在于重寫metamethod __call, 從而使得不光function才能被調用, table也能夠被調用.

主要思想就是, 通過一個table來保存注冊事件的若干響應函數, 然后拿table當function一樣來調用, 重寫__call后, 實現調用table時遍歷執行table中的注冊方法.

需要在lua5.0 或 lua.net上執行, lua 5.1略有改動.

  1. test.lua  
  2. do 

事件原型對象, 所有事件由此原型生成

  1. Event = {}  
  2.  
  3. function Event:New()  
  4.     local event = {}  
  5.     setmetatable(event, self)  
  6.     --覆蓋__index邏輯  
  7.     selfself.__index = self  
  8.     --覆蓋__call邏輯  
  9.     selfself.__call = self.Call  
  10.     return event  
  11. end 

事件注冊, 通過此方法將響應方法注冊到事件上.

@source:響應方法的所屬對象

@func:響應方法

  1. function Event:Add(source, func)  
  2.     table.insert(self, {source, func})      
  3. end 

內部方法, 重寫了默認__call邏輯, 當event被觸發調用時, 循環執行event中注冊的響應方法

@table:對象產生調用時將本身傳入

@:調用參數

  1. function Event.Call(table, )      
  2.     for _, item in ipairs(table) do  
  3.         --item[1]就是source, item[2]就是func響應方法  
  4.         --lua 5.1中無需使用unpack(arg), 直接使用即可  
  5.         item[2](item[1], unpack(arg))  
  6.     end  
  7. end 

以下為測試用例

創建一個window對象, 注冊按鈕的點擊事件

  1. Window = {  
  2.     Name = "Simonw's Window",      
  3. }  
  4. function Window:Init() 

注冊事件, self即Window, 對象來源.

  1. Button.ClickEvent:Add(self, self.Button_OnClick)      
  2.  

響應事件方法, sender即是傳來的Button對象

  1. function Window:Button_OnClick(sender)      
  2.     print(sender.Name.." Click On "..self.Name)  
  3. end 

創建一個button對象, 擁有ClickEvent這樣的事件

  1. Button = {  
  2.     Name = "A Button",  
  3.     --創建事件  
  4.     ClickEvent = Event:New(),  

執行點擊按鈕的動作

  1. function Button:Click()  
  2.     print('Click begin')  
  3.     --觸發事件, self即sender參數  
  4.     self.ClickEvent(self)  
  5.     print('Click end')  
  6. end 

從這里執行

  1. Window:Init()  
  2. Button:Click()  
  3. --[[ 

執行結果:

  1. > dofile 'test.lua'  
  2. Click begin  
  3. A Button Click On Simonw's Window  
  4. Click end  
  5. ]]  
  6.  
  7. end 

小結:解析Lua中實現類似C#事件機制學習教程的內容介紹完了,希望通過本文的學習能對你有所幫助!

責任編輯:zhaolei 來源: CSDN博客
相關推薦

2009-08-31 18:01:41

C#接口事件

2011-06-30 10:28:50

C#開發

2011-08-24 13:27:07

Lua 游戲C接口腳本

2011-08-23 16:59:16

C++LUA腳本LUA API

2011-08-24 15:22:09

2011-08-23 16:48:41

Lua 5.1API 函數

2009-08-27 16:53:01

C#委托C#事件

2009-09-02 14:00:34

C#文件處理

2009-09-03 16:38:49

C#回車鍵事件

2009-09-02 18:34:28

C#鼠標事件

2009-09-09 13:18:10

C# TextBox滾C# TextBox

2009-09-09 11:29:32

C# TextBox事

2011-08-25 16:38:06

EditPluslua

2011-08-22 17:25:31

LuaC++函數

2010-08-06 10:03:42

Flex事件

2024-05-16 13:36:04

C#委托事件

2011-08-23 17:33:08

LuaMetatable

2011-08-23 16:37:05

Lua數學庫

2011-08-31 15:41:38

Lua解釋器

2009-09-09 12:55:59

C# TextBox事
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色婷婷一区二区三区四区 | 久久精彩视频 | 91久久精品一区二区三区 | 精品一区二区三 | 国产精品免费高清 | 日本一区二区高清视频 | 欧美一区二区三区,视频 | 天堂一区在线 | 久久美女视频 | 亚洲视频免费一区 | 操久久 | 亚洲精品免费视频 | 久久精品一区二区三区四区 | 中文字幕在线观看视频一区 | 久久综合色综合 | 国产成人精品免费视频大全最热 | 亚洲欧美综合 | 欧美日韩中文在线 | 高清视频一区二区三区 | 成人无遮挡毛片免费看 | 日韩中文字幕一区二区 | 午夜av毛片 | 国产一级片免费在线观看 | 最近免费日本视频在线 | 日韩视频免费看 | 亚洲精品视频一区 | 一区二区av | 久久99精品久久久久婷婷 | 亚洲精品一二三 | 日本精品一区 | 国产欧美二区 | 亚洲免费网站 | 久久国产精品久久久久久久久久 | 亚洲精品免费在线 | 91最新入口 | 日韩一区二区久久 | 久久国际精品 | 一区二区三区国产 | 精品一二区 | 亚洲免费精品 | 看av片网站 |