在不使用"的情况下创建对象的引用:"在Lua

时间:2014-05-06 13:31:12

标签: oop object lua self

我的目标是为用Lua编写的GUI编写一个插件。它应该替换窗口的创建,而无需更改GUI本身的代码。创建窗口的原始函数如下所示:

function GUIclass.createWindow(arg1, arg2, arg3, arg4, arg5)
    -- do stuff
    return window
end

我的方法如下:

function MyClass.createWindow(arg1, arg2, arg3, arg4, arg5)
    local foo = self.attributeOne -- doesn't work, as self is undefined
    -- do some more stuff wich requires foo
    return window
end

... and later on
MyClassInst = MyClass:new()

请注意,这两个功能都在不同的文件中。我的想法是在初始化之后将指针替换为旧函数

GUIclass.createWindow = MyClass.createWindow

一切正常,但我似乎无法在MyClass.createWindow中获得对MyClass实例的引用。我尝试使用

local self = MyClassInst

在MyClass.createWindow中,但它是零。我也不喜欢这个,因为它仅限于Class的一个实例。正如标题中所述,":"也可以通过" GUIclass.createWindow(args)"来调用函数。 (现在指向MyClass.createWindow)。

那么如何在不使用"的情况下获得对类实例的引用:"?

3 个答案:

答案 0 :(得分:1)

我只是发帖回答..

尝试:

function MyClass.createWindow(self, arg1, arg2, arg3, arg4, arg5)

据我记得lua,等于:

function MyClass:createWindow(arg1, arg2, arg3, arg4, arg5)

就像

一样
class:something()

等于

class.something(class)

答案 1 :(得分:0)

你(大多数情况下)在这里为你所做的那一点。

如果您使用调用该函数,除了您提供的参数(以及任何具有该功能的已关闭变量)之外,您不会拥有该调用的任何上下文。

如果您想创建自定义createWindow函数的多个实例,可以让它们关闭某个类实例变量并在内部使用它,但您必须手动执行此操作并在之前使用这些类。我不知道你的情况是否可行。

我也不太了解代码所写的问题。

您是否希望有多个自定义createWindow功能可以根据需要反复修补GUIclass?或者,为什么您需要createWindow以您编写的方式获取self参数?

答案 2 :(得分:0)

如果您要创建新的窗口对象,则不需要自我参数。而是在MyClass.createWindow函数中创建新实例。通过使用表构造函数({})或通过调用另一个构造函数来执行此操作。例如:

local oldCreateWindow = GUIclass.createWindow
function MyClass.createWindow(...)
  local window = oldCreateWindow(...)
  local foo = window.attributeOne
  -- do some more stuff wich requires foo
  return window
end

我想我现在更了解你的问题了。我相信你会因为关闭而不是上课而感觉更好。

-- MyClass is actually just a table with lots of attributes that change a lot.
local MyClass = {}
local function createWindow(arg1, arg2, arg3, arg4, arg5)
  local foo = MyClass.attributeOne
  -- do some more stuff wich requires foo
  return window
end

GUIclass.createWindow = createWindow

之后,您对MyClass所做的任何更改都应对GUIclass.createWindow可见。