Skip to content

Commit bf31307

Browse files
committed
Events
1 parent 7220ca4 commit bf31307

File tree

7 files changed

+148
-64
lines changed

7 files changed

+148
-64
lines changed

README.md

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
- [抛出异常与捕捉异常](#抛出异常与捕捉异常)
2727
- [文件处理](#文件处理)
2828
- [委托](#委托)
29+
- [事件](#事件)
2930
- [序列化](#序列化)
3031
- [实用工具](#实用工具)
3132

@@ -280,7 +281,45 @@ end)
280281

281282

282283
## 委托
283-
C#在语言层面实现委托,将实例封装在委托对象中,而Lua则需要对对象进行绑定(类似于C++std)
284+
无实例的函数委托
285+
```lua
286+
local function SetAge1(i)
287+
Console.WriteLine("setAge1:", i)
288+
end
289+
local delegate = Delegate.New(nil, SetAge1)
290+
--使用Invoke调用
291+
delegate:Invoke(2)
292+
```
293+
有实例的函数委托
294+
```lua
295+
local TestObject = class.extends("Test.TestObject", Object)
296+
function TestObject:SetNumber(i)
297+
Console.WriteLine("SetNumber:", i)
298+
end
299+
300+
local testObj = TestObject.New()
301+
--提供实例
302+
local deleg = Delegate.New(testObj, TestObject.SetNumber)
303+
--不光可以使用Invoke,还可以直接用()
304+
deleg(5)
305+
```
306+
307+
## 事件
308+
事件采用多播委托的形式实现
309+
```lua
310+
local function EventFun1()
311+
Console.WriteLine("EventFun1")
312+
end
313+
314+
local function EventFun2()
315+
Console.WriteLine("EventFun2")
316+
end
317+
318+
local event = Event.New()
319+
event:Add(nil, EventFun1)
320+
event:Add(Delegate.New(nil, EventFun2))
321+
event:Invoke()
322+
```
284323

285324
## 序列化
286325
* 序列化方法,将lua表转换为字符串,或将字符串反序列化为lua语句/表

SysLib/Collections/List.lua

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,4 +106,19 @@ function List:GetEnumerator()
106106
end
107107
end
108108

109+
function List:Equals(target)
110+
---@type SysLib.Collections.List
111+
local list = target
112+
if self:GetCount() ~= list:GetCount() then
113+
return false
114+
end
115+
116+
for i = 1, self:GetCount() do
117+
if self:Get(i) ~= list:Get(i) then
118+
return false
119+
end
120+
end
121+
return true
122+
end
123+
109124
return List

SysLib/Delegate.lua

Lines changed: 15 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,29 @@
11
-------------------ModuleInfo-------------------
22
--- Author : jx
33
--- Date : 2020/02/15 23:58
4-
--- Description : 委托(函数指针封装)
4+
--- Description : 委托
55
------------------------------------------------
66
---@class SysLib.Delegate : SysLib.Object
7-
---@field New fun(obj, methodPointer):SysLib.Delegate
8-
local Delegate = class.extends("SysLib.Delegate", SysLib.Object)
7+
---@field New fun(target, method):SysLib.Delegate
8+
local Delegate, base = class.extends("SysLib.Delegate", SysLib.Object)
99

10-
function Delegate:constructor(obj, methodPointer)
11-
self.multiDelegate = SysLib.Collections.List.New()
12-
if methodPointer == nil then
13-
methodPointer = obj
14-
obj = nil
15-
end
16-
if methodPointer then
17-
self:Add(obj, methodPointer)
18-
end
19-
end
20-
21-
---@overload fun(funcPointer:function)
22-
function Delegate:Add(obj, methodPointer)
23-
local struct = {
24-
target = obj,
25-
methodPointer = methodPointer
26-
}
27-
self.multiDelegate:Add(struct)
10+
function Delegate:constructor(target, method)
11+
self.target = target
12+
self.method = method
2813
end
2914

30-
function Delegate:Remove(obj, methodPointer)
31-
--multi
32-
for index, value in ipairs(self.multiDelegate) do
33-
if value.target == obj and v.methodPointer == methodPointer then
34-
self.multiDelegate:RemoveAt(index)
35-
break
36-
end
15+
function Delegate:Invoke(...)
16+
if self.target ~= nil then
17+
--instance
18+
self.method(self.target, ...)
19+
else
20+
--static
21+
self.method(...)
3722
end
3823
end
3924

40-
function Delegate:RemoveAll()
41-
self.multiDelegate:Clear()
42-
end
43-
function Delegate:Invoke(...)
44-
for index, v in ipairs(self.multiDelegate) do
45-
if v.target ~= nil then
46-
--instance
47-
v.methodPointer(v.target, ...)
48-
else
49-
--static
50-
v.methodPointer(...)
51-
end
52-
end
25+
function Delegate:Equals(target)
26+
return self.target == target.target and self.method == target.method
5327
end
5428

5529
return Delegate

SysLib/Event.lua

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
-------------------ModuleInfo-------------------
2+
--- Author : jx
3+
--- Date : 2021/09/13 15:24
4+
--- Description : Events
5+
------------------------------------------------
6+
---@class SysLib.Event : SysLib.Object
7+
local Event = class.extends("SysLib.Event", SysLib.Object)
8+
9+
function Event:constructor()
10+
self.multiDelegate = SysLib.Collections.List.New()
11+
end
12+
13+
---@overload fun(delegate)
14+
function Event:Add(target, method)
15+
if not method then
16+
--delegate
17+
if target:GetType() ~= gettype(SysLib.Delegate) then
18+
throw(SysLib.ArgumentException.New("type error"))
19+
end
20+
self.multiDelegate:Add(target)
21+
return
22+
end
23+
self.multiDelegate:Add(SysLib.Delegate.New(target, method))
24+
end
25+
26+
---@overload fun(delegate)
27+
function Event:Remove(target, method)
28+
29+
if not method then
30+
--delegate
31+
if target:GetType() ~= gettype(SysLib.Delegate) then
32+
throw(SysLib.ArgumentException.New("type error"))
33+
end
34+
self.multiDelegate:Remove(target)
35+
return
36+
end
37+
38+
for index, item in each(self.multiDelegate) do
39+
if item.target == target and item.method == method then
40+
self.multiDelegate:RemoveAt(index)
41+
return
42+
end
43+
end
44+
end
45+
46+
function Event:RemoveAll()
47+
self.multiDelegate:Clear()
48+
end
49+
50+
function Event:Invoke(...)
51+
for index, value in each(self.multiDelegate) do
52+
value:Invoke(...)
53+
end
54+
end
55+
56+
return Event

SysLib/Object.lua

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,8 @@ function Object:Dispose()
2323

2424
end
2525
--virtual
26-
function Object:Equals(b, c)
27-
--判断对象地址
28-
if c == nil then
29-
--instance
30-
c = b
31-
b = self
32-
end
33-
return b == c
26+
function Object:Equals(target)
27+
return self == target
3428
end
3529

3630
---@return Type

SysLib/_include.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ SysLib.Runtime = {}
5858
SysLib.Runtime.Serialization = require "SysLib.Runtime.Serialization" if _SMPL then Serialization = SysLib.Runtime.Serialization end
5959

6060
SysLib.Console = require "SysLib.Console" if _SMPL then Console = SysLib.Console end
61+
SysLib.Event = require "SysLib.Event" if _SMPL then Event = SysLib.Event end
6162
SysLib.Delegate = require "SysLib.Delegate" if _SMPL then Delegate = SysLib.Delegate end
6263
SysLib.Convert = require "SysLib.Convert" if _SMPL then Convert = SysLib.Convert end
6364
SysLib.Activator = require "SysLib.Activator" if _SMPL then Activator = SysLib.Activator end

Test/DelegateEventsTest.lua

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,34 @@
1-
1+
--委托
22
local function SetAge1(i)
33
Console.WriteLine("setAge1:", i)
44
end
5-
65
local delegate = Delegate.New(nil, SetAge1)
7-
86
--使用Invoke调用
97
delegate:Invoke(2)
108

11-
local function SetAge2(i)
12-
Console.WriteLine("setAge2:", i)
13-
end
14-
--添加多播委托
15-
delegate:Add(nil, SetAge2)
16-
--使用()调用
17-
delegate(4)
189

19-
--创建实例对象
10+
--实例委托
2011
local TestObject = class.extends("Test.TestObject", Object)
2112
function TestObject:SetNumber(i)
2213
Console.WriteLine("SetNumber:", i)
2314
end
15+
2416
local testObj = TestObject.New()
17+
--提供实例
18+
local delegate2 = Delegate.New(testObj, TestObject.SetNumber)
19+
delegate2:Invoke(3)
2520

26-
Console.WriteLine("add instance method")
27-
delegate:Add(testObj, TestObject.SetNumber)
2821

29-
delegate:Invoke(5)
22+
--Events
23+
local function EventFun1()
24+
Console.WriteLine("EventFun1")
25+
end
26+
27+
local function EventFun2()
28+
Console.WriteLine("EventFun2")
29+
end
30+
31+
local event = Event.New()
32+
event:Add(nil, EventFun1)
33+
event:Add(Delegate.New(nil, EventFun2))
34+
event:Invoke()

0 commit comments

Comments
 (0)