我正在尝试创建一个新类,这个类继承了别人制作的另一个类,但我不了解课程的制作方式,也无法弄清楚如何制作新课程。
每个班级都在一个单独的.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;当我尝试将其用于其他地方时出错。
答案 0 :(得分:0)
您可以向任何表添加功能和数据。所以你可以做到
function newDerivedMC()
miniConsole = MiniConsole(...)
derived = {
yourData = 1,
yourMethod = function(self, ...) ... end,
}
setmetatable(derived, miniConsole)
return derived
end
yourMiniConsole = newDerivedMC()
如果您访问yourMiniConsole
中不存在的字段(数据或函数),解释程序将查找miniConsole
以查看它是否存在。如果你设置一个不存在的字段,同样的事情。