了解现有的' lua'类并继承它

时间:2014-05-14 06:53:02

标签: inheritance lua

我正在尝试创建一个新类,这个类继承了别人制作的另一个类,但我不了解课程的制作方式,也无法弄清楚如何制作新课程。

每个班级都在一个单独的.lua文件中。

基类如下所示:

local Base = {}
local function new (_, _type, _subtype)
    local new_base = {}
    local properties = {
    Type = {
        get = function ()
            return _type
        end
        },
    Subtype = {
        get = function ()
            return _subtype
        end
        }
    }

setmetatable( new_base, {
    __index = function (_, key)
        return (properties[key] and properties[key].get()) or Base[key]
    end,
    __newindex = function (_, key, value)
        if properties[key] and properties[key].set then
            properties[key].set( value )
        end
    end,
    } )
return new_base
end

setmetatable( Base, {
__call = new,
} )
return Base

然后我认为子类是从基类创建的,如下所示:

    local Base = require( "vyzor.base" )

    local MiniConsole = Base( "Component", "MiniConsole" )

    local function new (_, name, init_x, init_y, init_width, init_height, word_wrap, font_size)
        local new_console = {}
        <other local variables>

        local function updateAbsolutes ()
            <does stuff>
        end
    local properties = {
    Name = {
        get = function ()
            return name
        end
    },
    Container = {
        get = function ()
            return container
        end,
        set = function (value)
            if value.Type == "Frame" then
                container = value
            end
        end,
                     <and so on>
        end

    function new_console:Echo (text)
         echo( name, text )
     end
    <other functions>

setmetatable( new_console, {
    __index = function (_, key)
        return (properties[key] and properties[key].get()) or MiniConsole[key]
    end,
    __newindex = function (_, key, value)
        if properties[key] and properties[key].set then
            properties[key].set( value )
        end
    end,
    } )
master_list[name] = new_console
return new_console
end

setmetatable( MiniConsole, {
__index = getmetatable(MiniConsole).__index,
__call = new,
} )
return MiniConsole

我如何从MiniConsole类中创建一个类,例如具有新的函数和变量,并且还从Miniconsole共享相同的属性表以及更多的添加:

我认为应该开始这样的事情?

    local function new(_, name, title, init_x, init_y, init_width, init_height, word_wrap, font_size)
        local new_console = MiniConsole(name, init_x, init_y, init_width, init_height, word_wrap, font_size)

我尝试过的所有内容最终都会给我一个循环要求或其他错误&#34;当我尝试将其用于其他地方时出错。

1 个答案:

答案 0 :(得分:0)

您可以向任何表添加功能和数据。所以你可以做到

function newDerivedMC()
    miniConsole = MiniConsole(...)
    derived = {
        yourData = 1,
        yourMethod = function(self, ...) ... end,
    }
    setmetatable(derived, miniConsole)
    return derived
end

yourMiniConsole = newDerivedMC()

如果您访问yourMiniConsole中不存在的字段(数据或函数),解释程序将查找miniConsole以查看它是否存在。如果你设置一个不存在的字段,同样的事情。