oop - 为什么.__index只返回子类的函数而不返回基类的函数

标签 oop lua

item = {y = 21}

function item:new(o)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    return o
end

function item:Run()
    print("item running")
end

berry = item:new{x = 52}

function berry:new(o)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    return o
end
function berry:Run()
    print("berry is running")
    self.__index:Run()
end

berry:new{b = 32}:Run()

当它应该打印“berry is running”后跟“item running”时,输出会无限打印“berry is running”。如果我将 self.__index 更改为 self.__index.__index 甚至更改为 self.__index.__index.__index,输出仍会无限打印“浆果正在运行”。我该如何纠正这个问题?任何帮助将不胜感激

最佳答案

您已经覆盖了berryitemRun 函数,这使得它更难到达。此覆盖会导致无限循环,因为 self.__index 是对 self 的引用,它是一个 berry。现在 Run 在 berry 中定义 __indexberryRun 索引时将不再被调用

所以你的 berry:Run 函数本质上是

function berry:Run()
    print("berry is running")
    berry:Run()
end

我建议您更改berry:Run 函数,并在其中专门调用item.Run:

function berry:Run()
    print("berry is running")
    item.Run(self) -- specifically call item.Run and pass it self.
end

这将为您提供所需的输出:

berry is running

item running


或者,您可以通过在运行前在 berry 中定义它来保留 item:Run 函数:

berry.ParentRun. = berry.Run -- this will cause __index to run and get item:Run
function berry:Run()         -- This now defines berry.Run. now __index will no longer run for berry.Run
    print("berry is running")
    self:ParentRun()         
end

奖金说明:

你看到的原因

berry is running

berry is running

item running

评论中的建议是因为运行顺序是

object:Run() -- this calls berry passing the self of object

打印我们的第一个浆果正在运行

现在我们获取那个对象的元表,它是 berry 并调用它运行

berry:Run()

打印我们的第二个浆果正在运行

最后我们得到 berry 的元表,它是 item 并调用它运行

item:Run()

打印项目运行

关于oop - 为什么.__index只返回子类的函数而不返回基类的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59544441/

相关文章:

c++ - 如何使用 Lua C API 获取 .lua 脚本中所有表名的列表?

php - Laravel 资源 Controller Slug

python - 如何使用 OOP 将标签添加到另一个窗口 tkinter

lua - 仅在 float 窗口上显示标题栏

types - 类型检查不适用于 Luau 中的通用字符串键?

function - 只需写入函数名称(不带括号)即可调用 Lua 函数

oop - 将模型与其表示分离的面向对象的方法

php - Foreach 只返回数组元素的第一个字母?

php - 类之间能否保持PDO连接?

ios - iOS 设备上的 Lua 堆栈只有 ?,没有类名或行号