0

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

我现在的问题是,一些变量似乎正在相互泄漏。如果我调用一个函数调用window:click(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 中初始化

从这里我将这个类继承到我的其他类,只需设置我的新组件(文本框、按钮、标签等)的元表。这些组件是添加到self.components窗口中表格的内容。

问题是这些组件中的每一个都应该有自己的 clickCallback 表。我通过二传手写信给component.lua

function component:addClickHandler(handler)
    table.insert(self.clickCallback, handler)
end

但是当我调用click(x,y)一个组件时,它会调用所有的 clickHandler,无论是另一个按钮还是标签。

正如您在上面看到的,我正在设置一个名为focusthis 的参数似乎遇到了同样的问题,为一个组件设置它(如您所见,我正在循环遍历每个组件)为所有组件设置它(所以如果我有 4 个组件焦点在每个组件上重置 4 次)

为什么lua会这样做,可以做些什么来解决它?

4

1 回答 1

2

首先,如果您只是发布了一个完整的工作示例来演示问题,那么尝试从您的小片段中弄清楚发生了什么要困难得多。

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

换句话说,调用会调用anda:click的处理程序,因为表在类本身中,由该类的所有实例共享。修复它确保每个实例都有自己的处理程序表:abclickCallback

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
于 2012-07-15T04:18:17.370 回答