--通过table来保存注册事件的若干响应函数,然后拿table当function来调用,重写__call后,实现调用table时遍历执行table中的注册方法
--事件原型,所有事件有此原型生成
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
function Event.Call(tb,arg)
for _,item in ipairs(tb) do
--item[1]是事件源,item[2]func是事件方法
item[2](item[1],arg)
end
end
--创建windows对象,注册按钮的点击事件
Windows={
Name="beyond windows",
}
function Windows:Init()
--注册事件,self即windows事件源
Button.ClickEvent:Add(self,self.Button_OnClick)
end
--事件方法,self即传进来的button
function Windows: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.ClickEvent(self)
print("Click end")
end
--执行
Windows:Init();
Button:Click();
执行结果:执行结果已经放到下面了啊,怎么还在文中呢??恩 好了。
本文介绍了一种使用事件和响应函数进行编程的方法,通过创建事件对象并注册响应方法,实现了事件触发时自动执行相应操作。以按钮点击事件为例,展示了如何创建窗口对象、注册事件、定义事件方法及调用事件机制,最终实现按钮点击后的特定行为。
1504

被折叠的 条评论
为什么被折叠?



