Lua继承和方法

Posted

技术标签:

【中文标题】Lua继承和方法【英文标题】:Lua inheritance and methods 【发布时间】:2021-08-22 01:49:45 【问题描述】:

如何从类actor 继承一个新类player 并使用相同的参数在方法player:new(x, y, s) 中调用方法actor:new(x, y, s)。我需要使player:new 相同,但需要附加参数,以便player 可以拥有比actor 更多的属性。

有没有办法不仅在 new 方法中做到这一点,而且在其他方​​法中,比如 player:move(x, y) 会调用 actor:move(x, y)self:move(x, y) 但需要额外的代码?

我使用这种模式在模块中创建类:

local actor = 

function actor:new(x, y, s)

    self.__index = self

    return setmetatable(
        posx = x,
        posy = y,

        sprite = s
    , self)
end

-- methods

return actor

【问题讨论】:

【参考方案1】:

这样做的一个好方法是使用一个单独的函数来初始化您的实例。然后您可以简单地在继承的类中调用基类初始化。

就像这个例子:http://lua-users.org/wiki/ObjectOrientationTutorial

function CreateClass(...)
  -- "cls" is the new class
  local cls, bases = , ...
  -- copy base class contents into the new class
  for i, base in ipairs(bases) do
    for k, v in pairs(base) do
      cls[k] = v
    end
  end
  -- set the class's __index, and start filling an "is_a" table that contains this class and all of its bases
  -- so you can do an "instance of" check using my_instance.is_a[MyClass]
  cls.__index, cls.is_a = cls, [cls] = true
  for i, base in ipairs(bases) do
    for c in pairs(base.is_a) do
      cls.is_a[c] = true
    end
    cls.is_a[base] = true
  end
  -- the class's __call metamethod
  setmetatable(cls, __call = function (c, ...)
    local instance = setmetatable(, c)
    -- run the init method if it's there
    local init = instance._init
    if init then init(instance, ...) end
    return instance
  end)
  -- return the new class table, that's ready to fill with methods
  return cls
end

您只需这样做:

actor = CreateClass()
function actor:_init(x,y,s)
  self.posx = x
  self.posy = y
  self.sprite = s
end

player = CreateClass(actor)
function player:_init(x,y,s,name)
  actor.init(self, x,y,s)
  self.name = name or "John Doe"
end

【讨论】:

感谢您的宝贵时间和答案!

以上是关于Lua继承和方法的主要内容,如果未能解决你的问题,请参考以下文章

lua——元表元方法继承

Lua实现简单的类,继承,多态 实例

lua奇怪的继承

lua如何继承unity类

Lua面向对象

Chapter 16_3 多重继承