--通过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();
执行结果:执行结果已经放到下面了啊,怎么还在文中呢??恩 好了。
