面向对象的lua类
我已经读了很多关于面向对象的lua(设置元表)的书,并且我已经构建了一个带有继承的系统 我现在的问题是,一些变量似乎正在相互泄漏。如果我调用一个名为面向对象的lua类,lua,Lua,我已经读了很多关于面向对象的lua(设置元表)的书,并且我已经构建了一个带有继承的系统 我现在的问题是,一些变量似乎正在相互泄漏。如果我调用一个名为窗口的函数:单击(x,y)该函数调用得很好。此功能的任务是通知所有我的组件一次单击。它正在做什么 for number, component in pairs(self.components) do component.focus = false component:click(x, y, msg) end self.compone
窗口的函数:单击(x,y)
该函数调用得很好。此功能的任务是通知所有我的组件一次单击。它正在做什么
for number, component in pairs(self.components) do
component.focus = false
component:click(x, y, msg)
end
self.components
包含窗口的所有组件
为了充当所有组件的基类,我有一个名为component.lua的类,这个文件创建了一个名为components的表,并向其添加了一个create()
方法(它完成了所有常用的OO-lua工作),这个基类包含了我所有组件中需要的所有方法和变量,包括component:click(x,y)
然后再次调用它
for key, callback in pairs(self.clickCallback) do
callback()
end
return
clickCallback
表包含在通知组件时应调用的函数。并在component.lua中初始化
从这里,我通过设置新组件的元表(文本框、按钮、标签等),将这个类继承到其他类。这些组件是get添加到窗口中的self.components
表中的组件
问题是这些组件中的每一个都应该有自己的clickCallback表。我正在通过component.lua
function component:addClickHandler(handler)
table.insert(self.clickCallback, handler)
end
但是当我在一个组件上调用click(x,y)
时,它会调用所有的clickHandler,无论是另一个按钮还是标签
正如您在上面看到的,我正在设置一个名为focus
的参数,这似乎遇到了相同的问题,其中为一个组件设置它(正如您所看到的,我正在循环遍历每个组件)会为所有组件设置它(因此,如果我有4个组件,则每个组件上的焦点会重置4次)
lua为什么要这样做,以及可以做些什么来修复它?首先,如果你只是发布了一个完整的工作示例来演示问题,那么要想从你的小片段中找出发生了什么事情,就要困难得多 self.components包含窗口的所有组件 这可能就是你的问题。同样,这是一个猜测,因为您没有显示
create
方法,但是如果您的构造函数没有为每个实例初始化clickCallback
成员,那么它将使用类本身中的表
下面是一个说明问题的示例:
component = {}
component.__index = component
component.clickCallback = {}
function component.create()
return setmetatable({}, component)
end
function component:addClickHandler(handler)
table.insert(self.clickCallback, handler)
end
function component:click(x,y)
for _,callback in pairs(self.clickCallback) do
callback(x,y)
end
end
a = component.create()
b = component.create()
a:addClickHandler(function(x,y) print("a", x, y) end)
b:addClickHandler(function(x,y) print("b", x, y) end)
a:click(10,20)
b:click(11,22)
以下是输出,它显示了您描述的症状:
a 10 20
b 10 20
a 11 22
b 11 22
换句话说,调用a:click
调用a
和b
的处理程序,因为clickCallback
表位于类本身中,由该类的所有实例共享。修复程序确保每个实例都有自己的处理程序表:
component = {}
component.__index = component
function component.create()
return setmetatable({ clickCallback = {}}, component)
end
function component:addClickHandler(handler)
table.insert(self.clickCallback, handler)
end
function component:click(x,y)
for _,callback in pairs(self.clickCallback) do
callback(x,y)
end
end
a = component.create()
b = component.create()
a:addClickHandler(function(x,y) print("a", x, y) end)
b:addClickHandler(function(x,y) print("b", x, y) end)
a:click(10,20)
b:click(11,22)
输出:
a 10 20
b 11 22
谢谢你的回答。我无法提供一个工作示例,因为我挂接的API尚未发布。但是您从我的代码片段构建的内容与我的非常接近,并且您提供的解决方案有效。谢谢你!