【发布时间】:2014-10-21 22:25:01
【问题描述】:
我对 Lua 还很陌生,我正在尝试让一个类系统工作。我想做的是有一个基类,它有一堆属性,然后为按钮、文本框等对象扩展这个类。
基类将具有x、y、width、height 等属性,然后其他类将具有label 或colour 或类似属性。
如果我在基类上创建了诸如 render() 之类的函数,并在稍后尝试覆盖此函数,它似乎不起作用。 (大概我使用的类完全错误!)
这是我正在使用的复制示例:
Base = {}
Base.__index = Base
function Base.create(value)
local b = {}
setmetatable(b, Base)
b.value = value
return b
end
function Base:render()
print("I'm the base! : "..self.value)
end
Button = {}
Button.__index = Base
function Button.create(value)
local b = Base.create(value)
setmetatable(b, Button)
return b
end
function Button:render()
print("I'm a button! : "..self.value)
end
Button.create("TestBtn"):render()
我希望Button.create("TestBtn"):render() 做的是打印I'm a button! : TestBtn,但它会打印I'm the base! : TestBtn。
有人可以帮我用这个新函数覆盖原来的 render 函数吗?
谢谢,威尔。
【问题讨论】:
-
Button.__index = Base不正确。请注意这与Base.__index = Base的相同之处 -
@Etan 好的。我认为这就是继承如何发挥它的魔力。那么,我错过了什么或做错了什么?
-
嗯,所以我觉得我有点突然。这对于将
Button链接到Base是正确的。问题是您没有在任何东西上使用Button本身作为__index。我相信你需要setmetatable(b, {__index = Button})inButton.create。对此感到抱歉。 -
啊,现在可以了。精彩的。非常感谢 :) 我想我对 __index 和 metatable 的使用有点误解。我最好查一下。如果您想添加您的评论作为答案,我会将其标记为正确。
-
不,
Button.__index = Button实际上是正确的。这使得Button类中定义的方法可用于Button.create中创建的对象(Button既用作按钮对象的元表,也用作保存按钮方法的表)。缺少的是基类和派生类之间的继承链接:setmetatable(Button, Base)!
标签: inheritance lua