我如何重定向 LUA 中的所有 class 呼叫?

How do i redirect all class calls in LUA?

好吧,我不太擅长这个,所以我先举一个简单的例子来解释一下:

假设我有一个“class”,我们将其命名为 MyClass,假设它有一个名为 MyFunction 的函数,我们可以通过从任何 MyClassMyClassObject:MyFunction().

这样的对象

如果我无权访问该函数,并且想添加一个预先执行的新行为,我可以这样做:

MyClass.OriginalMyFunction = MyClass.MyFunction -- store old function

function MyClass:MyFunction(args)
    --Do something beforehand
    MyClass:OriginalMyFunction(args) --call original function with same args
end

这只是一个简单的示例,但我需要对 class 中所有可能的函数执行相同的操作。正如在 MyClassObject 上调用任何函数一样,应该在执行该函数之前执行一些代码。

这可能吗?如果可以,我该怎么做?

可以通过元表完成

有点粗略的例子:

local MyClass = {}
function MyClass:new()
  local newObj = {
    x = 0
  }
  self.__index = self
  return setmetatable(newObj, self)
end

function MyClass:get_x()
  print("hello from get_x")
  return self.x    
end

local HookedMyClass = {}

function HookedMyClass:new()
  local t = MyClass:new()
  local mt = {
      __index = function(table, key)
          print("hook")
          return(MyClass[key])
      end
  }
  return setmetatable(t, mt)
end

local hooked = HookedMyClass:new()

print(hooked:get_x())

这是一个继承示例,其中一些代码被添加到您的所有函数中:

function new (parent)
    local child =  {} 
    for k,v in pairs(parent) do
       if type(v)=="function" then    
          child[k] = function(...) 
                      print("inherit:")
                      return v(...)
          end
       else child[k] = v
       end
    end
    return child
end

my_class = new(class)

class.bar("arg1","arg2")
my_class.bar("arg1","arg2")
print(class.a)
print(my_class.a)

结果:

bar arg1 arg2
inherit:
bar arg1 arg2
value
value