Lua继承覆盖函数

时间:2014-10-21 11:27:01

标签: inheritance lua

我是Lua的新手,我正在努力让班级系统发挥作用。我想做的是拥有一个具有一堆属性的基类,然后为按钮,文本框等对象扩展这个类。

基类将具有xywidthheight等属性,然后其他类将具有labelcolour或类似。

如果我在基类上创建一个诸如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。

2 个答案:

答案 0 :(得分:1)

正如@siffiejoe所提到的,我所暗示的缺失细节是,你所写的Button对象不知道在Button表中查找方法。

我的解决方案创建了垃圾表来创建该关联,因此并不是最好的解决方案,但说明了这一点。

@ siffiejoe的答案更好,因为它更准确地编纂了所需的功能和关系。然后还需要额外的步骤来链接“类”表(即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