Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
面向对象的lua类_Lua - Fatal编程技术网

面向对象的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

我已经读了很多关于面向对象的lua(设置元表)的书,并且我已经构建了一个带有继承的系统

我现在的问题是,一些变量似乎正在相互泄漏。如果我调用一个名为
窗口的函数:单击(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尚未发布。但是您从我的代码片段构建的内容与我的非常接近,并且您提供的解决方案有效。谢谢你!