我是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
功能吗?
谢谢,Will。
答案 0 :(得分:1)
正如@siffiejoe所提到的,我所暗示的缺失细节是,你所写的Button
对象不知道在Button
表中查找方法。
我的解决方案创建了垃圾表来创建该关联,因此并不是最好的解决方案,但说明了这一点。
setmetatable(Button, Base)
)。
这里的关键是index
metamethod的操作。这是使用lua Reference Manual:
"index": The indexing access table[key].
function gettable_event (table, key)
local h
if type(table) == "table" then
local v = rawget(table, key)
if v ~= nil then return v end
h = metatable(table).__index
if h == nil then return nil end
else
h = metatable(table).__index
if h == nil then
error(···)
end
end
if type(h) == "function" then
return (h(table, key)) -- call the handler
else return h[key] -- or repeat operation on it
end
end
答案 1 :(得分:0)
定义Button:render
而不是Button:test
。